Trova tutti i file con nome contenente stringa


177

Ho cercato un comando che restituirà i file dalla directory corrente che contengono una stringa nel nome del file. Ho visto locatee findcomandi che possono trovare file che iniziano con qualcosa first_word*o finiscono con qualcosa *.jpg.

Come posso restituire un elenco di file che contengono una stringa nel nome file?

Ad esempio, se 2012-06-04-touch-multiple-files-in-linux.markdownfosse un file nella directory corrente.

Come potrei restituire questo file e altri contenenti la stringa touch? Utilizzando un comando comefind '/touch/'


la domanda è confusa. vuoi trovare file che contengono una stringa o file i cui nomi contengono detta stringa? alla prima domanda viene data risposta man grep, la seconda a man find. perché dovresti google invece di usare man, non lo so.
Solo qualcuno il

1
Grazie! La prima frase non specificava se fosse il contenuto del file o un nome file. Aggiornato.
Dru,

Risposte:


304

Utilizzare find:

find . -maxdepth 1 -name "*string*" -print

Troverà tutti i file nella directory corrente (eliminalo maxdepth 1se lo desideri ricorsivo) contenente "stringa" e lo stamperà sullo schermo.

Se si desidera evitare il file contenente ':', è possibile digitare:

find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

Se vuoi usare grep(ma penso che non sia necessario per quanto non vuoi controllare il contenuto del file) puoi usare:

ls | grep touch

Ma, ripeto, findè una soluzione migliore e più pulita per il tuo compito.


Grazie @Zagorax. Questo lo fa esattamente. Vorrei che il comando non fosse così lungo ma ayee :)
Dru

2
@Dru, modificato per coprire il caso se si desidera evitare due punti. findè uno strumento molto potente, deve essere in qualche modo "lungo". :)
Zagorax,

Grazie il primo ha fatto perfettamente senza restituire alcun contenuto.
Dru,

3
@Dru, se lo vuoi 'più corto' puoi evitare in -printquanto questo è il comportamento predefinito e in .quanto questa è la cartella predefinita in cui controlla.
Zagorax,

1
find . -name "*string*"Funziona benissimo anche. La rimozione .genera un errore dalla mia parte. Grazie ancora @Zagorax.
Dru,

14

Usa grep come segue:

grep -R "touch" .

-Rsignifica recurse. Se preferisci non entrare nelle sottodirectory, saltalo.

-isignifica "ignora caso". Potrebbe valere la pena provare anche questo.


Grande. Ho notato che alcuni contenuti del file seguono a :. Esiste un modo per trattenerlo? Stai usando un'opzione forse?
Dru,

1
Prova:grep -R "touch" . | cut -d ":" -f 2
carlspring il

Questo sembra produrre solo il contenuto dei file. In sostanza hai risposto alla mia domanda, però, posso provare a fare qualche ricerca per trattenere il contenuto.
Dru,

Ah ... hai solo bisogno dei nomi dei file? Esegui: grep -R "touch" . | cut -d ":" -f 1 (scusa, devo averti letto male).
carlspring,

Grazie @carlspring questo è interessante. greprestituisce file con contenuti e nomi di file contenenti toucho contenuti contenenti touch, non sono ancora sicuro del caso. touchDell'elenco dei file restituiti, metà contiene nel titolo e l'altra metà conatains touchnel corpo, non nel titolo. L'ho appena capito.
Dru,

5

L' -maxdepthopzione dovrebbe essere prima -namedell'opzione, come di seguito.,

find . -maxdepth 1 -name "string" -print

1
Devi mettere * prima e dopo la "stringa".
Aerin,

3
find $HOME -name "hello.c" -print

Ciò cercherà nell'intero sistema $HOME(cioè /home/username/) eventuali file denominati "hello.c" e visualizzerà i loro nomi di percorso:

/Users/user/Downloads/hello.c
/Users/user/hello.c

Tuttavia, non corrisponderà HELLO.Co HellO.C. Per far corrispondere la distinzione tra maiuscole e minuscole, passa l' -inameopzione come segue:

find $HOME -iname "hello.c" -print

Output di esempio:

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

Passa l' -type fopzione per cercare solo i file:

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

Il -inamefunziona sia su GNU o BSD (compreso OS X) Comando versione find. Se la tua versione del comando find non supporta -iname, prova la sintassi seguente usando il grepcomando:

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

O prova

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

Output di esempio:

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c

0

Se la stringa è all'inizio del nome, puoi farlo

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt

3
compgennon è un martello appropriato per questo chiodo. Questo strumento poco utilizzato è progettato per elencare i comandi disponibili e, come tale, elenca i file nella directory corrente (che potrebbero essere script) e non può né ricorrere né guardare oltre l'inizio di un nome di file né cercare il contenuto del file, rendendolo per lo più inutile.
msanford,

0

Un'alternativa alle molte soluzioni già fornite è l'utilizzo del glob **. Quando lo usi bashcon l'opzione globstar( shopt -s globstar) o ne usi zsh, puoi semplicemente usare il glob **per questo.

**/bar

esegue una ricerca ricorsiva nella directory per i file denominati bar(includendo potenzialmente il file barnella directory corrente). Si noti che ciò non può essere combinato con altre forme di globbing all'interno dello stesso segmento di percorso; in tal caso, gli *operatori tornano al loro solito effetto.

Nota che c'è una sottile differenza tra zshe bashqui. Mentre bashattraverserà i soft-link alle directory, zshno. Per questo devi usare il glob ***/in zsh.


0
find / -exec grep -lR "{test-string}" {} \;

1
Questa risposta è stata contrassegnata per bassa qualità. Spiegare cosa fanno le modifiche proposte.
Miroslav Glamuzina,

-2
grep -R "somestring" | cut -d ":" -f 1

2
Questa sembra essere una risposta a una domanda diversa, ma poiché non hai fornito alcuna spiegazione, ciò non è ovvio per chi chiede o per chiunque altro.
Toby Speight,
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.