2012-07-04 13 views
103

Ho cercato un comando che restituirà i file dalla directory corrente che contengono una stringa nel nome file. Ho visto i comandi locate e find che possono trovare i file che iniziano con qualcosa first_word* o terminano con qualcosa *.jpg.Linux - Trova file con nome contenente stringa

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.markdown era un file nella directory corrente.

Come posso restituire questo file e altri contenenti la stringa touch? Utilizzando un comando come find '/touch/'

+0

la domanda è confusione. vuoi trovare file contenenti una stringa o file i cui nomi * contengono la stringa? alla prima domanda viene risposto con 'man grep', il secondo con' man find'. perché dovresti usare Google invece di usare l'uomo, non lo so. –

+1

Grazie! La prima frase non specificava se si trattava di contenuti di file o di un nome di file. Aggiornato. – Dru

risposta

157

Uso find:

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

troverà tutti i file nella directory corrente (cancellare maxdepth 1 se lo vuoi ricorsivo) che contengono "stringa" e stamperà sullo schermo.

Se si vuole evitare file contenente ':', è possibile digitare:

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

Se si desidera utilizzare grep (ma penso che non è necessario, per quanto non si vuole controllare il contenuto del file) è possibile utilizzare:

ls | grep touch

Ma, ripeto, find è una soluzione migliore e più pulito per il vostro compito.

+0

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

+1

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

+0

Grazie al primo lo ha fatto perfettamente senza restituire alcun contenuto. – Dru

12

Usa grep come segue:

grep -R "touch" . 

-R significa recurse. Se preferisci non andare nelle sottodirectory, allora saltane.

-i significa "ignorare il caso". Potresti trovare questo vale la pena provare.

+0

Grande. Ho notato che alcuni contenuti di file seguono un ':'. C'è comunque da trattenerlo? Usando un'opzione forse? – Dru

+1

Prova: 'grep -R" touch ". | cut -d ":" -f 2' – carlspring

+0

Questo sembra produrre solo il contenuto dei file. In sostanza, hai risposto alla mia domanda, ma posso provare a scavare per trattenere i contenuti. – Dru

0

Se la stringa si trova all'inizio del nome, si può fare questo

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

'compgen' non è un martello appropriato per questo chiodo.Questo strumento poco utilizzato è progettato per elencare * i comandi disponibili * e, in quanto tale, elenca i file nella directory * current * (che potrebbero essere script) e non può né ricorrere né guardare oltre l'inizio di un nome di file né di un file di ricerca contenuto, rendendolo per lo più inutile. – msanford

2

L'opzione -maxdepth dovrebbe essere prima che l'opzione -name, come qui di seguito.,

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

Devi mettere * prima e dopo la "stringa". – Aaron

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

Questo cercherà l'intero sistema $HOME (ovvero /home/username/) per tutti i file denominati "ciao.c" e visualizzerà i loro percorsi:

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

Tuttavia, non corrisponderà HELLO.C o HellO.C.Per abbinare è case passaggio insensibile l'opzione -iname come segue:

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

uscite campione:

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

passare l'opzione -type f solo la ricerca di file:

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

I -iname opere sia su GNU o BSD (incluso OS X) comando di ricerca della versione. Se la versione di comando find non supporta -iname, provare la seguente sintassi con grep comando:

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

o provare

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

uscite del campione:

/Users/user/Downloads/Z/HELLO.C 
/Users/user/Downloads/Z/HEllO.c 
/Users/user/Downloads/hello.c 
/Users/user/hello.c 
0
grep -R "somestring" | cut -d ":" -f 1 
+0

Questa sembra essere la risposta a una domanda diversa - ma poiché non hai fornito spiegazioni, questo non è ovvio per il richiedente o per chiunque altro. –