Esto es bastante básico, tengo una carpeta con varias subcarpetas de archivos JS y quiero ejecutar el compilador Clojure de Google en todos los archivos de esas carpetas. El comando para procesar un solo archivo es el siguiente:
java -jar compiler.jar --js filename.js --js_output_file newfilename.js
¿Cómo modifico esto para que se ejecute en cada archivo JS en la estructura de mi directorio?
mv
el archivo con el nombre original.find -name '*.js' | while read jsfile; do java -jar compiler.jar --js "$jsfile" --js_output_file "new$jsfile" && mv "new$jsfile" "$jsfile"; done
debes hacer el truco.find -exec
es ideal para comandos simples para los complejosfind | xargs
es mucho mejor y también permite ejecutar comandos en paralelo.xargs
es mejor?También puede usar un
for
bucle simple , especialmente si los archivos están dentro de un solo directorio (sin subdirectorios). También se puede modificar para trabajar con subdirectorios.Sin recursividad:
o como un one-liner equivalente:
Para recurrir a subdirectorios (requiere GNU bash 4.0 o más reciente) (gracias @ChrisDown ):
fuente
globstar
para hacerlo.**
puede coincidir con un nivel arbitrario de recursión,**/*.js
funciona: sprunge.us/PXQKfor f in ./*.js; do
ofor f in ./**/*.js; do
para protegerse de los nombres de archivo que comienzan con un-
(no sé si eso es necesario en este caso, pero de todos modos es un buen hábito).