C'est assez basique, j'ai un dossier avec plusieurs sous-dossiers de fichiers JS et je veux exécuter le compilateur Clojure de Google sur tous les fichiers de ces dossiers. La commande pour traiter un seul fichier est la suivante:
java -jar compiler.jar --js filename.js --js_output_file newfilename.js
Comment puis-je modifier cela pour qu'il s'exécute sur chaque fichier JS de ma structure de répertoires?
mv
le fichier dans le nom d'origine.find -name '*.js' | while read jsfile; do java -jar compiler.jar --js "$jsfile" --js_output_file "new$jsfile" && mv "new$jsfile" "$jsfile"; done
faites l'affaire.find -exec
est idéal pour les commandes simples. pour les plus complexes,find | xargs
c'est beaucoup mieux et cela permet également d'exécuter des commandes en parallèle.xargs
c'est mieux?Vous pouvez également utiliser une
for
boucle simple , surtout si les fichiers se trouvent dans un seul répertoire (pas de sous-répertoires). Il peut également être modifié pour fonctionner avec des sous-répertoires.Sans récursivité:
ou comme doublure équivalente:
Pour recurse dans des sous-répertoires (nécessite GNU bash 4.0 ou plus récent) (merci @ChrisDown ):
la source
globstar
faire.**
peut correspondre à un niveau arbitraire de récursivité,**/*.js
fonctionne: sprunge.us/PXQKfor f in ./*.js; do
oufor f in ./**/*.js; do
afin de vous protéger des noms de fichiers commençant par un-
(je ne sais pas si c'est nécessaire dans ce cas, mais c'est quand même une bonne habitude).