Isso é bastante básico, tenho uma pasta com várias subpastas de arquivos JS e quero executar o compilador Clojure do Google em todos os arquivos dessas pastas. O comando para processar um único arquivo é o seguinte:
java -jar compiler.jar --js filename.js --js_output_file newfilename.js
Como modifico isso para ser executado em todos os arquivos JS na minha estrutura de diretórios?
mv
o arquivo no nome original.find -name '*.js' | while read jsfile; do java -jar compiler.jar --js "$jsfile" --js_output_file "new$jsfile" && mv "new$jsfile" "$jsfile"; done
, faça o truque.find -exec
é ótimo para comandos simples. para os complexosfind | xargs
é muito melhor e também permite executar comandos em paralelo.xargs
é melhor?Você também pode usar um
for
loop simples , especialmente se os arquivos estiverem em um único diretório (sem subdiretórios). Também pode ser modificado para funcionar com subdiretórios.Sem recursão:
ou como uma linha única equivalente:
Para recursão em subdiretórios (requer GNU bash 4.0 ou mais recente) (obrigado @ChrisDown ):
fonte
globstar
fazer isso.**
pode corresponder a um nível arbitrário de recursão,**/*.js
funciona: sprunge.us/PXQKfor f in ./*.js; do
oufor f in ./**/*.js; do
para se proteger dos nomes de arquivos que começam com a-
(não sei se isso é necessário nesse caso, mas é um bom hábito).