(2 réponses)
Fermé il y a 11 mois.
Il semble que "find", "bash" et "sed" dans certains cas ne fonctionnent pas comme prévu.
L'exemple suivant doit d'abord créer le fichier 'sample.txt', puis trouver le fichier et enfin le traiter par la commande '-exec'. La commande exécutée imprime le nom du fichier trouvé, les éprouvettes et le nom du fichier modifié. La commande 'sed' elle-même est utilisée pour remplacer 'txt' par 'TXT'.
touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo {} $(echo Specimen_before.txt {} Specimen_after.txt |sed -e "s/txt/TXT/g") ;
La sortie attendue est :
./sample.txt Spécimen_avant.TXT ./sample.TXT Spécimen_après.TXT
Au lieu de cela, il produit :
./sample.txt Spécimen_avant.TXT ./sample.txt Spécimen_après.TXT
(l'exemple a également été testé avec une substitution de commande à l'ancienne via des guillemets inversés '`' avec le même résultat)
Qu'est-ce que je fais de mal ?
Réponse acceptée :
La substitution de commande est exécutée avant find
commence même. La commande réellement exécutée (après substitutions, extensions et suppressions de guillemets, etc.) est
find ./ -maxdepth 1 -name *.txt -exec echo {} Specimen_before.TXT {} Specimen_after.TXT ;
Si vous avez besoin d'exécuter quelque chose fantaisie (tuyaux ou commandes multiples) avec -exec
, puis démarrez un shell séparé pour le faire :
find . -maxdepth 1 -type f -name '*.txt'
-exec sh -c 'printf "%s " "$1"; printf "%s %s %sn" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'