Commande Linux: rechercher des fichiers et exécuter la commande sur ceux-ci

16

Comment puis-je trouver tous les fichiers dans un répertoire et des sous-répertoires et exécuter une commande dessus?

Par exemple,

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

trouve tous les fichiers txt et:

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

l'envoie à gedit, mais dans un fichier texte. Je veux que gedit ouvre tous les fichiers texte.

xyz
la source

Réponses:

22

Vous pouvez utiliser l' -execindicateur pour exécuter une commande sur chaque fichier correspondant:

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

Syntaxe

La syntaxe est un peu étrange (voir -exec command ;dans les pages de manuel pour plus):

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

Vous pouvez également envisager -execdir, qui fera de même, mais exécute la commande à partir du sous-répertoire contenant le fichier correspondant (cela est généralement préférable).

David Cain
la source
1
Merci. Je vois que ça marche. Mais que signifie la fin ("{}" \ :)? exécuter la liste?
1
Le {}remplace le nom du fichier actuel et le point-virgule termine simplement la commande. La barre oblique inverse et les guillemets environnants sont juste pour empêcher l'expansion du shell.
David Cain
5

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

Pas dans la liste
la source
Merci. Je vois que ça marche. Mais qu'est-ce que le -print0 | xargs -0 part signifie?
1
@xyz, vous pouvez lire les drapeaux de toute commande UNIX en utilisant les pages de manuel. Essayez man findou man xargs, puis /recherchez un indicateur donné. La documentation est assez bonne, elle devrait répondre à vos questions.
David Cain
1
-print0imprime un caractère NULL après chaque entrée, -0s'attend à ce que les entrées soient séparées par un caractère NULL. C'est le moyen le plus sûr de gérer les noms délicats.
Notinlist
Et n'est-il pas un peu étrange que la syntaxe ne soit pas gedit xargs -0 au lieu de xargs -0 gedit. Je vois que le premier ne fonctionne pas, mais je ne vois pas pourquoi.
3
xargs est préférable à -exec pour des raisons de performances car xargs peut "grouper" un certain nombre d'arguments avant de les passer à gedit. Si vous avez besoin d'exécuter gedit sur chaque fichier individuellement, remplacez '... -print0 | xargs -0 gedit 'avec' ... -print0 | xargs -0 -i gedit {} 'xargs est une de ces commandes comme find et screen que vous ne savez jamais comment vous vous entendiez sans un an après l'avoir appris.
arclight