Comment exécuter une commande lorsqu'un fichier est trouvé ?
Considérons que j'ai un répertoire nommé testdir
qui contient les éléments suivants :
$ ls -R testdir/
testdir/:
dir1 dir2 dir3 dir4 dir5
testdir/dir1:
doc1.pdf
testdir/dir2:
file1.txt
testdir/dir3:
doc2.pdf
testdir/dir4:
file2.txt
testdir/dir5:
doc5.pdf
Maintenant, je veux effectuer une action (exécuter une commande) où find
trouve un certain type de fichier/fichier. Par exemple, laissez-moi trouver *.pdf
:
$ find . -name '*.pdf'
./testdir/dir3/doc2.pdf
./testdir/dir5/doc5.pdf
./testdir/dir1/doc1.pdf
Supposons maintenant que je veuille exécuter une commande (par exemple, dites touch file
) où la commande ci-dessus trouve le(s) fichier(s). En d'autres termes, je veux créer un fichier nommé file
dans chaque répertoire où au moins un .pdf
a été trouvé pour que j'obtienne :
$ ls -R testdir/
testdir/:
dir1 dir2 dir3 dir4 dir5
testdir/dir1:
doc1.pdf file
testdir/dir2:
file1.txt
testdir/dir3:
doc2.pdf file
testdir/dir4:
file2.txt
testdir/dir5:
doc5.pdf file
Comment puis-je accomplir un tel travail ?
Peut être pour chaque fois que le fichier est trouvé, cd
à l'endroit où le fichier existe et exécute une commande de manière récursive.
Je sais que find
a une fonctionnalité géniale :-exec
mais je n'arrive pas à le faire fonctionner.
Ce n'est qu'un exemple pour avoir une idée de ce que je veux faire. En gros :comment exécuter une commande là où le ou les fichiers sont trouvés (par find
) récursivement ?
Réponse acceptée :
Si vous exécutez cette commande, votre touch file
sera exécuté, potentiellement plusieurs fois, à partir du répertoire dans lequel la commande a été lancée :
find -name '*.pdf' -exec touch file ;
En revanche, si vous exécutez cette variante, chaque instance de la commande sera exécutée dans le répertoire du fichier cible :
find -name '*.pdf' -execdir touch file ;
Dans les deux cas, vous pouvez voir cela en action en remplaçant le touch file
avec soit echo {}
et/ou pwd
.
De la page de manuel :
-execdir command ;
-execdir command {} +
Comme
-exec
, mais la commande spécifiée est exécutée à partir du sous-répertoire contenant le fichier correspondant, qui n'est normalement pas le répertoire dans lequel vous avez lancéfind
.