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

25

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 searchtag bat ?

    
posta srk_cb 08.05.2015 - 14:44

6 risposte

39

Ricerca di file con bat Anywhere

Per trovare tutti i file ovunque all'interno di /path/to/folder i cui nomi contengono bat , puoi utilizzare:

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

Ho indicato il modello di ricerca *bat* perché, se le virgolette sono state omesse e i file corrispondono a *bat* nella directory corrente, la shell espanderà *bat* in una lista di essi e passerà che a find . Quindi find non funzionerebbe correttamente. (anche \*bat\* e "*bat*" funzionano).

Per cercare nella cartella in cui ti trovi attualmente (ad es., hai cd a), usa . , come al solito:

find . -name '*bat*'

Per cercare su tutto il tuo computer, utilizza / . Per cercare la tua home directory, usa ~ , o il nome completo della tua home directory. ( La shell espande ~ al percorso completo della directory home.)

Ampliare o restringere la ricerca, in base al nome

Se vuoi eseguire la ricerca senza distinzione tra maiuscole e minuscole, quindi i file contenenti BAT , bAt e così via vengono confrontati, utilizza il test -iname anziché il test -name :

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

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

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

Ho notato che tutti i nomi dei file hanno bat all'inizio o alla fine della parte che precede il suffisso .c . Se vuoi evitare la corrispondenza di file come embattled.c , puoi usare:

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

-o è l'operatore o .

Solo file corrispondenti

Per trovare solo file normali - e non cartelle, collegamenti simbolici, e nodi dispositivo speciali: puoi utilizzare -type f . Questo è spesso consigliato e talvolta abbastanza appropriato ... ma spesso non è quello che desideri , specialmente se stai eseguendo find allo scopo di esaminare l'output da solo. Se avessi un link 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 \)

Questo utilizza l'operatore -o e anche parentesi per il raggruppamento (che deve essere quotato in modo che la shell non le tratti in modo specifico, altrimenti si verificherà un errore di sintassi).

Supponiamo di voler solo vedere collegamenti simbolici che puntano a un file normale (e non collegamenti simbolici a directory, nodi di dispositivi, ecc.). In realtà è ancora più semplice: usa -xtype invece di -type . A condizione che tu non stia eseguendo find con -L , -xtype su un collegamento simbolico verifica il tipo di file a cui punta il link.

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

Se hai un link simbolico a un altro link simbolico a un file, -xtype f lo abbinerà anche se la sua destinazione diretta è un altro link simbolico piuttosto che un file normale. Questo è quasi sempre quello che vuoi.

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

Ottenere l'output dettagliato

L'azione predefinita di

find se non ne specifichi una è -print . Tutti i comandi sopra indicati sono equivalenti a se stessi con -print virato alla fine.

find viene spesso utilizzato per eseguire comandi basati sui file trovati, spesso comandi che apportano modifiche. Ma ci sono anche altre azioni il cui scopo è visualizzare i risultati, oltre a -print . Di particolare interesse è -ls :

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

Questo fornisce informazioni dettagliate su ogni file, in un formato a più colonne, simile a (sebbene non proprio uguale a) cosa vedresti eseguendo ls file .

Ulteriori letture

Per ulteriori informazioni su find e altri modi per trovare i file, vedi:

  • La pagina di manuale di find , accessibile online o eseguendo man find in un terminale.
  • Il manuale di riferimento di GNU findutils , che fornisce un'ampia documentazione su find , locate , e xargs di utilità.
  • FindingFiles nella Guida di Ubuntu wiki , che mostra come usare find così come molti altri metodi.
risposta data Eliah Kagan 08.05.2015 - 15:43
16

Il modo più semplice è eseguire

locate bat

In questo modo puoi cercare nell'intero computer file contenenti "bat" nel nome del file

Per aggiornare l'elenco dei file sul PC, esegui

updatedb

Esegui questo comando quando hai recentemente aggiunto nuovi file al tuo account

    
risposta data Mark Kirby 08.05.2015 - 14:49
14

Apri il terminale e cambia le directory nella directory da cui vuoi iniziare la ricerca e poi esegui questo comando:

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

Il . avvia il comando find dalla directory corrente.
Il -name corrisponde alla stringa bat e fa distinzione tra maiuscole e minuscole. ( -iname non fa distinzione tra maiuscole e minuscole)
% Co_de% cerca solo i file.

    
risposta data karel 08.05.2015 - 14:46
6

Se i file si trovano nella directory corrente, utilizzare:

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

O (per averli riga per riga):

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

Se vuoi cercare nel sistema quei file, usa:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c
    
risposta data chaos 08.05.2015 - 15:00
4

Si desidera utilizzare il comando find , con l'opzione -iname per la corrispondenza del nome file senza distinzione tra maiuscole e minuscole oppure l'opzione -name per le corrispondenze nome file con distinzione tra maiuscole e minuscole. Entrambi ti consentono di utilizzare nomi di caratteri jolly. Quindi, per trovare tutti i nomi di file che contengono "bat" useresti:

find / -iname '*bat*'

o

find / -name '*bat*'

Il * significa "qualsiasi carattere (s)", quindi la ricerca sta cercando bat con qualsiasi carattere, incluso nessuno, prima o dopo di esso. Il / ricerca dalla directory radice in modo ricorsivo, puoi usare . che cercherà in modo ricorsivo dalla directory corrente, o il percorso assoluto da cui vuoi effettuare la ricerca. Dai un'occhiata a come cercare i file usando regex in linux script di shell

    
risposta data AJefferiss 08.05.2015 - 14:46
2

Utilizza il buon vecchio find .

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

es:.

% 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.
    
risposta data A.B. 08.05.2015 - 15:09

Leggi altre domande sui tag