Comando Linux: trova i file ed esegui il comando su di essi


16

Come posso trovare tutti i file in una directory e sottodirectory ed eseguire un comando su di essi?

Per esempio,

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

trova tutti i file txt e:

find . -type f -name "*.txt" | gedit

lo invia a gedit, ma all'interno di un file di testo. Voglio che Gedit apra tutti i file di testo.

Risposte:


22

Puoi usare il -execflag per eseguire un comando su ogni file corrispondente:

$ find ./ -type f -name "*.txt" -exec gedit "{}" \;

Sintassi

La sintassi è un po 'strana (vedi -exec command ;nelle manpage per ulteriori informazioni):

The string `{}' is replaced by the current file name being processed

Potresti anche considerare -execdir, che farà lo stesso, ma esegue il comando dalla sottodirectory contenente il file corrispondente (questo è generalmente preferibile).


1
Grazie. Vedo che funziona. Ma cosa significa la fine ("{}" \ :)? eseguire l'elenco?

1
La {}sta in per il nome del file corrente, e il punto e virgola è solo chiude il comando. La barra rovesciata e le virgolette circostanti servono solo a prevenire l'espansione della shell.
David Cain,

5

find . -type f -name "*.txt" -print0 | xargs -0 gedit


Grazie. Vedo che funziona. Ma cosa significa -print0 | xargs -0 parte significa?

1
@xyz, puoi leggere le bandiere di qualsiasi comando UNIX usando le pagine man. Prova man findo man xargs, quindi, /per cercare un determinato flag. La documentazione è abbastanza buona, dovrebbe rispondere alle tue domande.
David Cain,

1
-print0stampa un carattere NULL dopo ogni voce, si -0aspetta che le voci siano separate da un carattere NULL. È il modo più sicuro per gestire nomi difficili.
Notinlist

E non è un po 'strano che la sintassi non sia gedit xargs -0 invece di xargs -0 gedit. Vedo che il primo non funziona, ma non riesco a capire perché.

3
xargs è preferibile -exec per motivi di prestazioni poiché xargs può "raggruppare" un numero di argomenti prima di passarli a gedit. Se è necessario eseguire gedit su ciascun file singolarmente, sostituire '... -print0 | xargs -0 gedit 'con' ... -print0 | xargs -0 -i gedit {} 'xargs è uno di quei comandi come find e screen che non sai mai come andare avanti senza un anno dopo averlo appreso.
accesa il
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.