comando per trovare i file cercando solo una parte dei loro nomi?


32

Supponiamo che ci siano file con nomi:

batman.c
debate.c
cricketbat.c

Quale comando e come dovrei usarlo per elencare tutti questi file usando il tag di ricerca bat?


5
Vuoi elencare i file corrispondenti solo nella directory corrente? in qualsiasi directory in o sotto la directory corrente? in qualsiasi parte del sistema?
steeldriver,

Risposte:


47

Trovare file con batAnywhere

Per trovare tutti i file ovunque all'interno dei /path/to/foldercui nomi siano presenti bat, è possibile utilizzare:

find /path/to/folder -name '*bat*'

Ho citato il modello di ricerca *bat*perché, se le quotazioni sono state omesse e file corrispondano *bat*nella directory corrente, il guscio si espanderà *bat*in una lista di loro e passare che a find. Quindi findnon funzionerebbe bene. ( \*bat\*e "*bat*"funziona anche.)

Per cercare nella cartella in cui ci si trova attualmente (ad esempio, in cui è stato cdeditato), utilizzare ., come al solito:

find . -name '*bat*'

Per cercare in tutto il computer, utilizzare/ . Per cercare la tua home directory, usa ~o il nome completo della tua home directory. ( La shell si espande~ nel percorso completo della directory home.)

Ampliare o restringere la ricerca, in base al nome

Se si desidera effettuare la ricerca è case-sensitive, quindi i file che contiene BAT, bAte così via sono abbinati, utilizzare la -inameprova al posto del -nametest di:

find /path/to/folder -iname '*bat*'

Ho notato che tutti i tuoi file finiscono .c. Se vuoi solo trovare file del genere, usa:

find /path/to/folder -name '*bat*.c'

Ho notato che tutti i tuoi nomi di file hanno bato all'inizio o alla fine della parte che precede il .csuffisso. Se si desidera evitare la corrispondenza di file come embattled.c, è possibile utilizzare:

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-oè il o operatore .

Solo file corrispondenti

Per trovare solo file normali, e non cartelle, collegamenti simbolici e nodi speciali del dispositivo, è possibile utilizzare -type f. Questo è spesso raccomandato e talvolta abbastanza appropriato ... ma spesso non è quello che vuoi davvero , specialmente se stai correndo findallo scopo di esaminare l'output da solo. Se avessi un collegamento simbolico corrispondente alla tua ricerca, non vorresti saperlo?

Se vuoi trovare sia file regolari che collegamenti simbolici, puoi usare:

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

Quello usa il -o operatore e anche le parentesi per il raggruppamento (che deve essere citato in modo che la shell non li tratti in modo speciale, altrimenti si otterrà un errore di sintassi).

Ma supponiamo che tu voglia vedere solo collegamenti simbolici che alla fine puntano a un file normale (e non collegamenti simbolici a directory, nodi di dispositivo, ecc.). In realtà è ancora più semplice: usare -xtypeinvece di -type. A condizione che non sta eseguendo findcon -Lla bandiera, -xtypesu un collegamento simbolico mette alla prova il tipo di file dei punti link.

find /path/to/folder -name '*bat*' -xtype f

Se si dispone di un collegamento simbolico a un altro collegamento simbolico a un file, -xtype flo corrisponderà anche se è diretto simbolico a un altro obiettivo è un altro simbolico anziché un file normale. Questo è quasi sempre quello che vuoi.

Spesso le persone pensano di volere -type f, ma in realtà vogliono-xtype f .

Ottenere un output dettagliato

findL 'azione predefinita se non ne specifichi una è -print. Tutti i comandi sopra riportati sono equivalenti a se stessi con -printvirata alla fine.

findviene spesso utilizzato per eseguire comandi in base ai file trovati, spesso comandi che apportano modifiche. Ma ci sono anche altre azioni il cui scopo è quello di visualizzare i risultati, oltre -print. Di particolare interesse è -ls:

find /path/to/folder -name '*bat*' -ls

Ciò fornisce informazioni dettagliate su ciascun file, in un formato a più colonne, simile (anche se non esattamente uguale) a quello che vedresti eseguendo .ls file

Ulteriori letture

Per ulteriori informazioni finde altri modi per trovare i file, vedere:


1
Ottima risposta, soprattutto il -xtypeconsiglio; forse ls *bat*e -maxdepth/ mindepthvale anche la pena menzionare.
mklement0,

2
@ mklement0 Grazie! L'OP non ha ancora fornito chiarimenti sulla posizione dei file e sulla necessità o meno della ricorsione. Poiché la risposta del caos erals già coperta , mi sono concentrato sul caso ricorsivo findqui. Naturalmente, sarebbe utile anche una risposta dettagliata che includa un elenco non (o meno) ricorsivo di nomi di file che corrispondono a qualche modello ( lse findcon -maxdepth). Potresti voler pubblicare una risposta del genere!
Eliah Kagan,

16

Il modo più semplice è correre

locate bat

In questo modo è possibile cercare in tutto il computer i file contenenti "bat" nel nome del file

Per aggiornare l'elenco dei file sul tuo PC

updatedb

Esegui questo comando quando hai aggiunto di recente nuovi file al tuo account


1
necessitàupdatetdb
Sergiy Kolodyazhnyy

4
@Serg Per trovare nuovi file (più recenti dell'ultima volta in cui è updatedbstata eseguita l'ultima volta manualmente o automaticamente), è sudo updatedbnecessario eseguire prima, sì.
Eliah Kagan,

Si noti che ciò cercherà nell'intero sistema la corrispondenza dei nomi bat.
terdon,

1
@terdon L'ho già dichiarato nella risposta, non credo che meritasse il voto negativo quando l'ho già dichiarato.
Mark Kirby,

1
Si noti che questo è MOLTO più veloce rispetto find /alle locatericerche da un database, mentre findelenca ricorsivamente /e quindi corrisponde al regex.
Timothy Gu,

14

Aprire il terminale e modificare le directory nella directory da cui si desidera iniziare la ricerca, quindi eseguire questo comando:

find . -name "*bat*" -type f 

Il .avvia il comando find dalla directory corrente.
Il -nameCorrisponde alla stringa bated è case sensitive. ( -inameÈ case insensitive)
Le -type fricerche per solo i file.


cancellare e ripristinare? ok +1: P;)
AB

6

Se i file si trovano nella directory corrente utilizzare:

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

Oppure (per averli riga per riga):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

Se si desidera cercare tali file nel sistema, utilizzare:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c

1
Se la tua ricerca inizia con la directory principale, potresti voler aggiungere sudo, poiché questo comando segnalerà "Autorizzazione negata" per alcune cartelle
Sergiy Kolodyazhnyy

4

Si desidera utilizzare il findcomando, con l' -inameopzione per la corrispondenza dei nomi file senza distinzione tra maiuscole e minuscole o l' -nameopzione per le corrispondenze dei nomi file con distinzione tra maiuscole e minuscole. Entrambi ti consentiranno di utilizzare i nomi jolly. Quindi, per trovare qualsiasi nome di file che contenga "bat" dovresti usare:

find / -iname '*bat*'

O

find / -name '*bat*'

I *significa "qualsiasi carattere (s)", così la ricerca è alla ricerca di bateventuali caratteri, inclusi nessuno, prima o dopo. Le /ricerche dalla directory principale ricorsivamente, è possibile utilizzare .che cercherà ricorsivamente dalla directory corrente o il percorso assoluto da dove si desidera cercare. Dai un'occhiata a come cercare file usando regex nello script della shell di linux


@EliahKagan grazie, ho aggiunto alcune informazioni in più alla mia risposta.
AJefferiss,

+1 Grazie per la modifica. IMO è un punto di forza di questa risposta che evita di raccomandare l'uso indiscriminato -type f, che fa molto di più che semplicemente escludere le directory e spesso non è ciò che gli utenti vogliono davvero .
Eliah Kagan,

2

Usa il buon vecchio find.

find <path_for_search> -type f -iname "*bat*" 

per esempio.:

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

da man find:

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

-iname pattern 
          Like -name, but the match is case insensitive.
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.