Je suis relativement nouveau dans Bash et j'essaie de faire quelque chose qui à première vue semblait assez simple - exécuter la recherche sur une hiérarchie de répertoires pour obtenir tous les fichiers * .wma, diriger cette sortie vers une commande où je les convertis en mp3 et enregistrez le fichier converti au format .mp3. Ma pensée était que la commande devrait ressembler à ce qui suit (j'ai laissé la commande de conversion audio et j'utilise plutôt echo pour l'illustration):
$ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3
Si je comprends bien, l'argument -print0 me permettra de gérer les noms de fichiers qui ont des espaces (ce que beaucoup d'entre eux font car ce sont des fichiers musicaux). Je m'attends ensuite (à la suite de xargs) à ce que chaque chemin de fichier de find soit capturé en f, et qu'en utilisant la sous-chaîne match / delete à la fin de la chaîne, je devrais faire écho au chemin de fichier d'origine avec un mp3 extension au lieu de wma. Cependant, au lieu de ce résultat, je vois ce qui suit:
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
...
Donc ma question (en dehors de la spécification `` qu'est-ce que je fais mal ici '') est la suivante: les valeurs qui sont le résultat d'une opération de tuyau doivent-elles être traitées différemment dans les opérations de manipulation de chaînes que celles qui sont le résultat d'une affectation de variable ?
{}
membre)
xargs
est plus approprié que exec
. Voir ce stackpost stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs pour un cas d'espèce.
xargs
avecfind
. Il est livré avec une-exec
option. Pouvez-vous simplement ajouter la commande que vous allez utiliser à votre question, et quelqu'un peut vous montrer lafind
commande correcte ?