Como executo um comando em vários arquivos?

7

Isso é bem básico, eu tenho uma pasta com várias subpastas de arquivos JS e eu quero rodar 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 estrutura de diretórios?

    
por Mataniko 27.06.2013 / 09:45

2 respostas

11

Você pode usar find :

find . -name "*.js" -exec java -jar compiler.jar --js {} --js_output_file new{} \;
    
por 27.06.2013 / 09:50
6

Você também pode usar um simples loop for , especialmente se os arquivos estiverem em um único diretório (sem subdiretórios). Ele pode ser modificado para trabalhar com subdiretórios também.

Sem recursão:

for filename in ./*.js
do
    java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"
done

ou como um one-liner equivalente:

for filename in ./*.js; do java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"; done

Para recorrer a subdiretórios (requer GNU bash 4.0 ou mais recente) (obrigado @ChrisDown ):

shopt -s globstar
for filename in ./**/*.js; do
    java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"
done
    
por 27.06.2013 / 09:56