답변:
당신은 사용할 수 있습니다 find
:
find . -name "*.js" -exec java -jar compiler.jar --js {} --js_output_file new{} \;
mv
파일을 원래 이름에 씁니다 .
find -name '*.js' | while read jsfile; do java -jar compiler.jar --js "$jsfile" --js_output_file "new$jsfile" && mv "new$jsfile" "$jsfile"; done
하지 않으려면 트릭을 수행해야합니다.
find -exec
간단한 명령에 좋습니다. 복잡한 것들은 find | xargs
훨씬 낫고 명령을 병렬로 실행할 수 있습니다.
xargs
는 왜 더 나은지 설명 할 수 있습니까?
for
특히 파일이 단일 디렉토리 내에있는 경우 (하위 디렉토리가없는 경우) 단순 루프를 사용할 수도 있습니다 . 서브 디렉토리에서도 작동하도록 수정할 수 있습니다.
재귀없이 :
for filename in ./*.js
do
java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"
done
또는 동등한 단일 라이너로 :
for filename in ./*.js; do java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"; done
서브 디렉토리로 재귀 (GNU bash 4.0 이상이 필요) ( @ChrisDown 덕분에 ) :
shopt -s globstar
for filename in ./**/*.js; do
java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"
done
globstar
하면 그렇게 할 수 있습니다 .
for f in ./*.js; do
하거나 for f in ./**/*.js; do
파일 이름으로 시작하는 파일 이름으로부터 자신을 보호 하는 것이 좋습니다 -
(이 경우에는 필요한지 모르겠지만 어쨌든 좋은 습관입니다).