Come posso trovare ricorsivamente tutti i file nelle cartelle correnti e sottocartelle in base alla corrispondenza dei caratteri jolly?


1888

Come posso trovare ricorsivamente tutti i file nelle cartelle correnti e sottocartelle in base alla corrispondenza dei caratteri jolly?

Risposte:


2742

Usa cerca per quello:

find . -name "foo*"

findha bisogno di un punto di partenza e il .(punto) punta alla directory corrente.


21
So che questo è etichettato come linux ma vale la pena menzionarlo: il percorso è richiesto per altre varianti * nix che non sono linux. Su Linux, il percorso è facoltativo se si desidera utilizzare il punto.
IslandCow,

4
@Seatter "foo *" dice a find di cercare tutti i file che iniziano con "foo". È solo il suo esempio. Puoi usare "gpio *" per trovare tutti i file i cui nomi iniziano con gpio, o semplicemente "gpio1" per trovare tutti i file chiamati gpio1.
schumacher574,

29
nota che "foo *" è tra virgolette, quindi la shell non lo espande prima di passarlo per trovarlo. se lo avessi fatto find . foo*, foo*sarebbe stato ampliato E POI passato per trovare.
grinch,

33
Vale la pena sottolineare che " "è molto necessario per la ricerca ricorsiva.
WesternGun

3
Utile anche: se non vuoi essere informato sulle directory di cui non hai il permesso (o altri errori), puoi farlofind . -name "foo*" 2>/dev/null
Jobbo

222

Il piping find in grep è spesso più conveniente; ti dà la piena potenza delle espressioni regolari per la corrispondenza arbitraria con caratteri jolly.

Ad esempio, per trovare tutti i file con stringa "foo" senza distinzione tra maiuscole e minuscole nel nome file:

~$ find . -print | grep -i foo

58
findinoltre ha le -iname, -regexe -iregexbandiere per wildcard-insensitive caso, regex, e la corrispondenza regex-insensitive caso, in modo da tubazioni grepè inutile.
iobender,

7
Non penso che si tratti di essere inutili, ma di essere più convenienti.
Elijah Lynn

1
Tuttavia, il piping su grep -v può consentire di usare stringhe o regex semplici per rimuovere le voci che non si desidera.
door_number_three

3
@iobender - Purtroppo, per esperienza, posso dirti che non tutti i sistemi sono dotati di un findcomando che supporta tali opzioni. A volte grepdiventa l'unica opzione.
Mr. Llama,


39
find -L . -name "foo*"

In alcuni casi, ho avuto bisogno del parametro -L per gestire i collegamenti alla directory simbolica. Per impostazione predefinita, i collegamenti simbolici vengono ignorati. In quei casi è stato abbastanza confuso dato che avrei cambiato directory in una sottodirectory e vedevo il file corrispondente allo schema ma find non restituiva il nome file. L'uso di -L risolve questo problema. Le opzioni di collegamento simbolico per find sono -P -L -H


1
L interruttore è molto utile. Molte volte l'utente non ha idea delle directory sottostanti, sia che siano softlink o che siano normali directory. Quindi, in caso di dubbio, è sempre bene usare l'opzione L. Almeno, mi ha sempre aiutato.
Ritesh,

2
Questa è stata la risposta per me. Grazie!
iedmrc,

34

Se la tua shell supporta una nuova opzione globbing (può essere abilitata da :)shopt -s globstar , puoi usare:

echo **/*foo*

per trovare ricorsivamente file o cartelle. Questo è supportato da Bash 4, zsh e shell simili.


Personalmente ho definito questa funzione shell:

f() { find . -name "*$1*"; }

Nota: la riga sopra può essere incollata direttamente nella shell o aggiunta nel ~/.bashrcfile dell'utente .

Quindi posso cercare qualsiasi file digitando:

f some_name

In alternativa è possibile utilizzare fdun'utilità con una sintassi semplice, ad es fd pattern.


1
Questo passa a un solo livello. Non ricorrere nelle sottodirectory per me
Broncha,

3
@Broncha Perché è necessario attivare il globbing esteso tramite shopt -s globstarcomando. Questo è supportato in Bash, zsh e shell simili.
Kenorb,

bash-3.2$ shopt -s globstarbash: shopt: globstar: invalid shell option name
stravagante il

@drewish Devi aggiornare Bash a 4.x
kenorb il

echo * / * foo è meno veloce di trovare
Josef Klimuk,

32

fd

Nel caso in cui findsia troppo lento, prova l' fdutilità: un'alternativa semplice e veloce afind scritta in Rust.

Sintassi:

fd PATTERN

demo:

Pagina iniziale: https://github.com/sharkdp/fd


17
La prima volta che ho visto una gif su SO in quasi 9 anni. Bel lavoro!
Joshua Pinter,

1
Quei risultati di prestazione sembrano molto promettenti. Potresti considerare di aggiungere fd alla birra fatta in casa ...
Gr3go,

fuori tema: quale strumento hai usato per creare il file svg per la demo?
aprile

2
@aprodan L'immagine demo è stata copiata da GitHub, ma credo che stiano usando asciinema, quindi convertiti in formato GIF, ma non sono sicuro.
Kenorb,

1
In realtà è in formato SVG, quindi probabilmente asciicast2vectorpuò essere usato.
Kenorb,

27
find <directory_path>  -type f -name "<wildcard-match>"

Nel jolly-match puoi fornire la stringa che desideri abbinare, ad es. * .C (per tutti i file c)


1
La tua risposta è la prima più corretta qui in quanto cerca solo i file come specificato. Gli altri non specificando il tipo restituiranno le directory.
wilsotc,

se si desidera cercare una directory "-type f" potrebbe essere modificato in "-type d"
XYZ_Linux

11

Puoi usare:

# find . -type f  -name 'text_for_search'

Se vuoi usare REGX usa -iname

# find . -type f  -iname 'text_for_search'

9

Il comando seguente elenca tutti i file con il nome esatto "modello" (ad esempio) nelle cartelle correnti e nelle relative sottocartelle.

find ./ -name "pattern"


8

Il modo predefinito per cercare file ricorsivi e disponibile nella maggior parte dei casi è

find . -name "filepattern"

Inizia l'attraversamento ricorsivo per il nome file o il modello all'interno della directory corrente in cui ti trovi. Con il comando find, è possibile utilizzare caratteri jolly e varie opzioni, per visualizzare un elenco completo di opzioni, digitare

man find

o se le pagine man non sono disponibili sul tuo sistema

find --help

Tuttavia, ci sono strumenti più moderni e più veloci che trovi, che stanno attraversando l'intero filesystem e indicizzando i tuoi file, uno di questi strumenti comuni è individuare o slocate / mlocate, dovresti controllare il manuale del tuo sistema operativo su come installarlo, e una volta che è installato ha bisogno di avviare il database, se lo script di installazione non lo fa per te, puoi farlo manualmente digitando

sudo updatedb

E, per usarlo per cercare un determinato tipo di file

locate filename

Oppure, per cercare il nome file o lo scalpiccio all'interno della directory corrente, è possibile digitare:

 pwd | xargs -n 1 -I {} locate "filepattern"

Esaminerà il suo database di file e stamperà rapidamente i nomi dei percorsi che corrispondono al modello che hai digitato. Per visualizzare l'elenco completo delle opzioni di individuazione, digitare: locate --help oman locate

Inoltre, è possibile configurare Locate per aggiornare il suo database negli orari pianificati tramite cron job, quindi il cron di esempio che aggiorna db all'1AM sarebbe simile a:

0 1 * * * updatedb

Questi lavori cron devono essere configurati da root, poiché updateb necessita del privilegio di root per attraversare l'intero filesystem.


7

per la ricerca di file
find / -xdev -name settings.xml -> intero computer
find ./ -xdev -name settings.xml -> directory corrente e la sua sottodirectory

per i file con estensione

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

6

Sono sorpreso di vedere che la localizzazione non viene usata pesantemente quando dobbiamo ricorsivamente.

Vorrei prima individuare "$ PWD" per ottenere l'elenco dei file nella cartella corrente di interesse, quindi eseguire greps su di essi come mi pare.

locate "$PWD" | grep -P <pattern>

Naturalmente, ciò presuppone che l'aggiornamentob sia stato eseguito e che l'indice sia aggiornato periodicamente. Questo è un modo molto più veloce per trovare i file che per eseguire una ricerca e chiedendogli di scendere dall'albero. Menzionandolo per completezza. Niente contro l'uso di find, se l'albero non è molto pesante.


locate "$PWD*.mp4" Solo per ricordare che potresti essere in grado di saltare lagrep
Jefferey Cave

5

Sotto il comando aiuta a cercare qualsiasi file

1) Indipendentemente dal caso
2) Risultato Escludendo le cartelle senza autorizzazione
3) Ricerca dalla radice o dal percorso che ti piace. Cambia / con il percorso che preferisci.

Sintassi:
find -iname '' 2> & 1 | grep -v "Autorizzazione negata"

Esempio

trova / -iname 'C * .xml' 2> & 1 | grep -v "Autorizzazione negata"

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"

1
perché mai usi grep per quello? Basta reindirizzare stderr a nullfind / -iname '*C*.xml' 2>/dev/null
phuclv il

3

Se si desidera cercare un file speciale con caratteri jolly, è possibile utilizzare il seguente codice:

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

Supponiamo che tu voglia cercare tutti i file .conf da qui:

.indica che la ricerca è iniziata da qui (posizione corrente)
-typeindica il tipo di elemento di ricerca che qui è il file (f).
-namesignifica che vuoi cercare file con nomi * .conf .


3

Ciò cercherà tutti i file correlati nelle directory correnti e secondarie, calcolando il loro conteggio delle righe separatamente e totalmente:

find . -name "*.wanted" | xargs wc -l

2

Uso

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Spiegazione

  1. Il primo parametro è la directory che si desidera cercare.
  2. Di default find fa la ricorsione.
  3. Lo -osta per -or. Quindi sopra significa cercare questo jolly O questo. Se hai un solo motivo, non è necessario -o.
  4. Sono richieste le virgolette attorno al modello jolly.
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.