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.

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).


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.