Come "grep" per un nome file invece del contenuto di un file?


135

grep è usato per cercare all'interno di un file per vedere se una riga corrisponde a una determinata espressione regolare. Tuttavia, ho questa situazione: voglio scrivere un'espressione regolare che corrisponderà al nome del file stesso (e non al contenuto del file). Lo eseguirò dalla directory principale del sistema, per trovare tutti quei file che corrispondono all'espressione regolare.

Ad esempio, se voglio trovare tutti i file di modulo VB che iniziano con una "f" e terminano con .frm, userò l'espressione regolare -

   "f[[:alnum:]]*\.frm"

Grep può farlo? In caso contrario, esiste un'utilità che mi permette di fare questo? Grazie.

Risposte:


120

È necessario utilizzare findanziché grepin questo caso.

Puoi anche usare findin combinazione con grepo egrep:

$ find | grep "f[[:alnum:]]\.frm"

12
Questo non è necessario. Trova ha quella funzionalità integrata con l' -regexopzione.
whereswalden,

4
non è necessario qui, ma grep supporta perl regex mentre find no.
Dan,

2
No, puoi usare grep. Molto più semplice rispetto all'utilizzo di find. Aggiungi l'opzione "-rl" e cercherà il nome del file invece del file. Vedi il mio post qui sotto.
RM

@ alpha_989, ho detto che grep lo supporta, cosa che fa: gnu.org/software/grep/manual/html_node/… punto è che il piping a grep è necessario solo se hai bisogno di pcre. whereeswalden ha la risposta giusta
Dan

60

Esempio

find <path> -name *FileName*

Dal manuale:

trova il modello -name

La base del nome del file (il percorso con le directory principali rimosse) corrisponde al modello di shell. Poiché le directory principali vengono rimosse, i nomi dei file considerati per una corrispondenza con -name non includeranno mai una barra, quindi "-name a / b" non corrisponderà mai a nulla (probabilmente dovrai usare invece -path). I metacaratteri ("*", "?" E "[]") corrispondono a "." all'inizio del nome di base (si tratta di una modifica in find-utils-4.2.2; vedere la sezione CONFORMITÀ STANDARD di seguito). Per ignorare una directory e i file in essa contenuti, usare -prune; vedere un esempio nella descrizione di -path. Le parentesi graffe non sono riconosciute come speciali, nonostante il fatto che alcune conchiglie, tra cui Bash, conferiscano bretelle con un significato speciale nei modelli di conchiglie. La corrispondenza del nome file viene eseguita con l'uso della funzione di libreria fnmatch (3). Non dimenticare di racchiudere il modello tra virgolette per proteggerlo dall'espansione della shell.


2
Ho trovato questa risposta la più utile. Ho aggiunto un paio di opzioni aggiuntive: find . -maxdepth 1 -name "*filename*" -print
JSON C11

47

Come ha detto Pablo, è necessario utilizzare findal posto di grep, ma non c'è bisogno di pipe finda grep. findha quella funzionalità integrata:

find . -regex 'f[[:alnum:]]\.frm'

findè un programma molto potente per la ricerca di file per nome e supporta la ricerca per tipo di file, limitazione della profondità, combinando termini di ricerca diversi con operazioni booleane ed eseguendo comandi arbitrari sui file trovati. Vedi la pagina man di ricerca per maggiori informazioni.


1
Vorrei aggiungere la funzione molto utile di find per cercare per data con -mtimee-mmin
Johnride,

1
Inoltre, l'opzione -regex esegue le corrispondenze con l'intero percorso. Quindi per funzionare l'esempio deve essere aggiunto. * All'inizio della regex.
tumasgiu,

15

Puoi trovare il percorso completo di un file usando grep, basta solo pipe l'output dell'albero

tree -f | grep filename

Ecco una funzione che puoi inserire nel tuo .bash_profile o .bashrc

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path

-f è facoltativo.
jasonleonhard,

10
find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here

tipi_descriptor: -

f: file normale

d: directory

l: collegamento simbolico

c: dispositivi a caratteri

b: dispositivi a blocchi


1
Non riesco a usare un nome di file che segue il -type typedescriptorsolo. È un errore?
Allan Nørgaard,

5

Puoi anche fare:

tree | grep filename

Questo convoglia l'output del comando tree per grep per una ricerca. Questo ti dirà solo se il file esiste.


1

No, grep funziona bene per questo:

 grep -rl "filename" [starting point]

 grep -rL "not in filename"

1
Questo cerca il contenuto del file per "nome file", quindi stampa i nomi dei file con le corrispondenze. OP vuole abbinare i nomi dei file, non i contenuti dei file.
Matthew,

1
D'accordo, questo non cerca i nomi dei file, ma stampa solo i nomi dei nomi dei file per i quali trova contenuti corrispondenti. Hai frainteso sia la -le -Lopzioni considerevolmente.
Prometeo

2
+1 per essere esattamente quello di cui ho bisogno. Felice di non aver dovuto criticare la domanda per trovare la risposta di cui avevo bisogno
Alexander McNulty il

-1

Anche per più file.

tree /path/to/directory/ | grep -i "file1 \| file2 \| file3"

-1

Il modo più semplice è

find . | grep test

qui troverai un elenco ricorsivo di tutti i file nella directory (. E poi è solo un semplice grep. appariranno tutti i file con il nome "test".

puoi giocare con grep secondo le tue esigenze. Nota: poiché grep è una classificazione di stringa generica, può comportare non solo il nome dei file. ma se un percorso ha una directory ('/xyz_test_123/other.txt') verrebbe anche al set di risultati. Saluti


Questo troverà qualsiasi cosa con "test" nel percorso, ad es ./foo/bar/latest/fred.txt.
Paul R,

Oh. Quello a cui non avevo pensato. Grazie per averlo menzionato.
sachyy
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.