Comando find di Linux: come trovare file e directory
Il comando find in Linux esamina la directory specificata e i suoi sotto-elementi per trovare file o directory che corrispondono a condizioni come nome, tipo o dimensione. Specificare insieme la posizione della ricerca e le condizioni, e racchiudere i modelli di nome dei file tra virgolette in modo che la shell non li espanda in anticipo.
Formato base e ambito della ricerca
Nel formato seguente, il percorso iniziale è dove inizia la ricerca e le condizioni limitano ciò che trovare. Il percorso stesso è incluso anche nell'obiettivo della ricerca. Gli esempi seguenti si basano su GNU findutils find e Bash.
find PATH EXPRESSION
find . esplora la directory corrente e le sottodirectory, e find /etc parte da /etc. Se non vengono specificate condizioni, stampa i percorsi ed esplora anche file e directory nascosti. Le directory senza permessi possono mostrare errori di accesso e i loro contenuti non verranno cercati.
L'esercizio successivo crea file in una nuova directory temporanea. Devi continuare nello stesso terminal per mantenere la variabile workdir. Dopo aver stampato il percorso per controllare la posizione, esegui l'esempio.
workdir=$(mktemp -d)
mkdir -p "$workdir/docs" "$workdir/empty-dir"
touch "$workdir/docs/app.conf" "$workdir/docs/EXTRA.CONF" "$workdir/docs/notes.txt" "$workdir/.hidden.conf" "$workdir/empty.txt"
printf '%s\n' "$workdir"
Trova per nome e tipo di file
-name corrisponde con distinzione tra maiuscole e minuscole rispetto al componente finale del percorso, non all'intero percorso. -iname non distingue tra maiuscole e minuscole. Le virgolette singole impediscono alla shell di espandere * prima di passare il modello a find.
find "$workdir" -name '*.conf'
find "$workdir" -iname '*.conf'
Il primo comando cerca app.conf e .hidden.conf, e il secondo comando trova anche EXTRA.CONF. L'ordine dell'output può variare a seconda dell'ambiente. Digitare find /etc *.conf non ha alcuna condizione sul nome e può agire in modo inatteso a seconda dell'espansione della shell, quindi evitalo. Invece, usa find /etc -name '*.conf'.
-type f cerca file normali, -type d cerca directory. Se le condizioni sono combinate, tutte devono essere soddisfatte.
find "$workdir" -type f -name '*.conf'
find "$workdir" -type d -name 'docs'
Il primo comando restituisce solo file regolari con estensioni corrispondenti, il secondo restituisce solo directory chiamate docs. Per impostazione predefinita, GNU find non segue i collegamenti simbolici nelle sottodirectory. Per cercare i collegamenti stessi, usare -type l.
Restringere l'intervallo in base alla profondità e agli elementi vuoti
-maxdepth 1 cerca solo fino al percorso di partenza e agli elementi direttamente sotto di esso. Per escludere il percorso di partenza dai risultati, specificare anche -mindepth 1. È consigliabile posizionare entrambe le opzioni prima delle condizioni in GNU find.
find "$workdir" -mindepth 1 -maxdepth 1 -type d
In pratica, docs e empty-dir subito sotto verranno visualizzati. -empty trova file regolari vuoti e directory vuote, quindi è possibile distinguere specificando il tipo desiderato.
find "$workdir" -type f -empty
find "$workdir" -type d -empty
I file creati con touch durante la pratica sono tutti vuoti. Nel secondo comando appare empty-dir. Non considerare direttamente i risultati della ricerca come obiettivi da eliminare; prima, controlla il percorso e le condizioni.
Esecuzione di comandi sui file trovati
-exec esegue comandi sugli elementi corrispondenti. L'esempio seguente restituisce il conteggio dei byte dei file normali senza eliminarli. {} viene sostituito dal percorso trovato, e + raggruppa più percorsi il più possibile da passare al comando.
find "$workdir" -type f -name '*.conf' -exec wc -c -- {} +
Poiché i file di esercitazione sono vuoti, il conteggio dei byte per ciascun file viene visualizzato come 0. wc può anche visualizzare il totale se vengono ricevuti più file. Anche se ci sono spazi nei nomi dei file, ogni percorso viene passato come argomento separato. Per eseguire il comando per ogni elemento separatamente, è possibile utilizzare \; invece di +.
Prima di combinare i comandi di eliminazione o modifica, visualizza prima solo i percorsi con le stesse condizioni e controlla i file interessati e i backup. Nelle directory in cui altri utenti possono modificare i file durante la ricerca, i file interessati possono cambiare anche dopo il controllo, quindi è necessaria una cautela extra. Per maggiori dettagli, fare riferimento a GNU find considerazioni sulla sicurezza.
Quando i risultati sono diversi da quelli attesi
Se non ci sono risultati, controlla il percorso di partenza, il maiuscolo/minuscolo dei caratteri nel nome, l'estensione e il tipo di file in ordine. Controlla anche se il modello era racchiuso tra virgolette e se è necessario il percorso completo invece di -name. Quando si effettua la ricerca basandosi sul percorso completo, puoi usare -path.
Se si verifica un errore di permesso, significa che ci sono aree che non possono essere cercate. Controlla i permessi di accesso necessari e, quando usi i privilegi di amministratore, limita attentamente l'intervallo di ricerca e le azioni da eseguire. I significati dettagliati dei modelli di nome e delle opzioni possono essere trovati in spiegazione dei modelli di nome di GNU find.




