C'è una forma più semplice di scoperta. -name "* substring_of_filename *" su Mac OS X e Linux?


4

Su Mac OS X o Linux, c'è una forma più semplice del comando

find . -name "*substring_of_filename*"

che è trovare tutti i file che contengono nomi substring_of_filename all'interno della directory corrente (o qualche altra directory data). Perché è una cosa comune da fare, c'è un modo per rendere il comando più breve e più facile da digitare, possibilmente utilizzando un alias o una funzione in Bash? O c'è qualche altro comando facile da usare che può essere usato?

Ad esempio:

findfile . substring_of_filename

( Nota: la domanda come originariamente scritta usata APP_CONFIG come un esempio di substring_of_filename.)


2
locate app_config
knittl

1
@ knittl: Ma locate non è limitato alla directory corrente e alle sue sottodirectory.
user unknown

Risposte:


5

Su Mac OS X puoi anche inserire un alias usando mdfind in .bashrc:

# mdfind uses Spotlight 
alias findf='mdfind -onlyin . -name'

findf app_config

3

Ecco la tua funzione di bash, inseriscila .bashrc:

function findfiles { find "$1" -iname "*$2*"; }

(Nota che -iname rende la ricerca insensibile al maiuscolo / minuscolo. Se non lo vuoi, usa -name anziché.)


È anche possibile eseguirlo in una sessione bash se si desidera utilizzarlo solo per la sessione corrente.
Wuffers

iname non è equivalente, name è. Potrebbe essere il tuo utilizzo preferito, ma non era la domanda.
user unknown

2

Al contrario! C'è uno ancora più complicato, ma uno, che funziona:

find . -name "*app_config*"

Il punto non è necessario per trovare gnu:

find -name "*app_config*"

Ma devi mascherare l'asterisco, altrimenti saranno interpretati dalla shell, e troverai solo nomi di file che corrispondono a quelli nella directory corrente, che corrispondono " APP_CONFIG ".


sembra non essere vero almeno su Mac OS X

Cosa non sembra vero? Che puoi omettere il punto? O che un file che contiene 'app_config' nel suo nome e che si trova nella directory corrente, limiterà la ricerca al suo nome.
user unknown

Intendo su Mac OS X, puoi usare find . -name *app_config* senza le virgolette

1
@BenU: Non ho un sistema con Mac OS X, ma su Linux, la necessità di virgolette deriva dalla shell. Se non cito il "*", la shell prova ad espanderla. Non è necessario per trovare, e non, se * non corrisponde a qualcosa nella directory corrente - quindi viene passato invariato alla ricerca. Puoi provare le virgolette singole, che sono consentite anche in bash, ma impedirebbero l'espansione delle variabili (che non è il caso, qui, ma a volte altro) -name "*.pdf.$id" per esempio.
user unknown

1
Per la cronaca, citazioni dovrebbero essere usato in OS X nello stesso modo di Linux, poiché OS X ha la stessa shell di Bash di Linux.
Arne Stenström

1

Metti questo nel tuo ~/.profile o ~/.bashrc, non sono sicuro su quale Mac usi:

findname () 
{ 
    find . -name "*$1*"
}

quindi chiama la funzione da findname name_of_file

se volessi usare più parole, dovresti diventare più complicato ... il modo più semplice che riesco a pensare a mano a mano è questo:

findname() 
{ 
    find .|grep $1|grep $2|grep $3|grep $4 
}

Questo troverà ogni file nella tua directory corrente, cercherà la stringa 1, quindi cercherà quel risultato per la stringa 2 e così via, fino a quando non arriva a 4.


La seconda funzione non funziona a meno che le variabili non vengano citate come find . |grep "$1" |grep "$2" |grep "$3" |grep "$4". Inoltre, cerca parti del percorso piuttosto che parti di nomi di file.
Arne Stenström

0

Invece di fare questo in uno script bash, zsh, tcsh, sh, ecc ... ho creato un TextExpander scorciatoia. Digito i tipi sh≤Space≥ e TE

trova . -nomino "**"

e posiziona il cursore tra gli asterischi.


0

Su OS X, perché non usare semplicemente locate? Premesso che il localizzatore non viene aggiornato molto spesso per impostazione predefinita, ma è possibile cambiarlo facilmente (modificare la pianificazione dei lavori periodici su OS X). locate è un BSDism, non so se è su Linux o no.


In alcuni scenari locateb è un rischio per la sicurezza. La home directory con crittografia LUKS + radice non cifrata + indicizzazione updatedb / home e la memorizzazione della cache da qualche parte in / var (che non è crittografata) fa filtrare i nomi dei file da / home.
vtest

0

Sulla maggior parte delle distribuzioni Linux, puoi usare locate. Per esempio:

$ locate find | grep bin
/sbin/findfs
/usr/bin/find
/usr/bin/find2perl
/usr/bin/findsmb
/usr/bin/gst-typefind-0.10
/usr/bin/memdiskfind
/usr/bin/oldfind
/usr/bin/sane-find-scanner
/usr/include/c++/4.5/ext/pb_ds/detail/bin_search_tree_/find_fn_imps.hpp
/usr/include/c++/4.5/ext/pb_ds/detail/binary_heap_/find_fn_imps.hpp
/usr/include/c++/4.5/ext/pb_ds/detail/binomial_heap_base_/find_fn_imps.hpp

0

Se usi bash 4 (con shopt -s globstar ) o zsh:

prinftf %s\\n **/*substring_of_filename*

0

La risposta è no". Non esiste una stenografia per "trova il file per nome con sottostringa nella directory corrente o sotto" in GNU find. Gli alias che uso per ovviare a questa limitazione sono i seguenti (per zsh ):

# find file in cwd by [S]ubstring, case [I]nsensitive, change to first sub[D]irectory
finds()   { find .  -name "*$**"; }
findsi()  { find . -iname "*$**"; }
findsid() { cd `find . -iname "*$**" | head -n1 | xargs dirname`; }

L'ultimo è il mio favorito. Questi possono essere usati come segue:

> ls -R
.:
file1  File2  HOLEFILE  test

./test:
hello

(questa è la directory dei test)

> findsi file
./HOLEFILE
./File2
./file1

> finds file
./file1

> finds le
./File2
./file1

> findsid ell
> ls
hello

Se qualcuno li collega alla loro shell di scelta, sentiti libero di modificare questo post e aggiungere la tua versione.
Alex Hirzel

-1

Penso che solo grep possa farlo bene, senza bisogno di trovare. Opzioni pertinenti dalla manpage:

 -l, --files-with-matches
          Suppress  normal  output;  instead  print the name of each input
          file from which output would normally have  been  printed.   The
          scanning  will  stop  on  the  first match.  (-l is specified by
          POSIX.)

 -H, --with-filename
          Print  the  file  name for each match.  This is the default when
          there is more than one file to search.

 -R, -r, --recursive
          Read all  files  under  each  directory,  recursively;  this  is
          equivalent to the -d recurse option.

Nota che anche se -H è l'impostazione predefinita quando c'è più di un file da cercare, ti suggerisco comunque di usarlo esplicitamente. Questo switch risolve un problema specifico, è meglio ricordare questo frammento di conoscenza direttamente correlata rispetto al caso limite (ricerca di più file) quando questa opzione è l'impostazione predefinita.

Quindi la versione di grep del comando di ricerca originale sarà simile a questa:

grep -lHR app_config .

2
Sospetto che "tutti i file con l'app_config" significhi veramente "tutti i file con app_config nei loro nomi".
Eroen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.