GNU/Linux >> Tutoriels Linux >  >> Linux

Exécuter une commande où un fichier est trouvé ?

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 .


Linux
  1. mkfs.hfsplus :commande introuvable

  2. nano :commande introuvable

  3. tri :commande introuvable

  4. ln :commande introuvable

  5. sed :commande introuvable

tune2fs :commande introuvable

fsck :commande introuvable

queue :commande introuvable

rm :commande introuvable

toucher :commande introuvable

mv :commande introuvable