여러 파일에서 명령을 실행하는 방법


13

이것은 매우 기본적이며 JS 파일의 여러 하위 폴더가있는 폴더가 있으며 해당 폴더의 모든 파일에서 Google의 Clojure 컴파일러를 실행하고 싶습니다. 단일 파일을 처리하는 명령은 다음과 같습니다.

java -jar compiler.jar --js filename.js --js_output_file newfilename.js

디렉토리 구조의 모든 JS 파일에서 실행되도록 이것을 어떻게 수정합니까?

답변:


14

당신은 사용할 수 있습니다 find:

find . -name "*.js" -exec java -jar compiler.jar --js {} --js_output_file new{} \;

감사합니다. 원본 JS 파일을 덮어
써야하므로이

--js와 --js_output_file이 달라야하는 경우 파일 이름을 매개 변수로 사용하는 2 줄 스크립트를 만들고 임시 파일에 출력을 쓰고 mv파일을 원래 이름에 씁니다 .
Anthon

별도의 스크립트를 작성 find -name '*.js' | while read jsfile; do java -jar compiler.jar --js "$jsfile" --js_output_file "new$jsfile" && mv "new$jsfile" "$jsfile"; done하지 않으려면 트릭을 수행해야합니다.
David Baggerman

find -exec간단한 명령에 좋습니다. 복잡한 것들은 find | xargs훨씬 낫고 명령을 병렬로 실행할 수 있습니다.
돌진

@rush xargs는 왜 더 나은지 설명 할 수 있습니까?
Mel Boyce 2016 년

7

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

1
이것은 질문에서 요청한 하위 디렉토리를 되풀이하지 않습니다. bash4 +를 사용 globstar하면 그렇게 할 수 있습니다 .
Chris Down

1
그렇습니다. 좋은 대답이며 아는 것이 좋습니다. 그러나 다른 대답은 내가 필요한 것을 정확하게 수행합니다.
Mataniko

1
오, 나는 "여러 개의 하위 폴더"부분을 완전히 놓쳤다. 죄송합니다. 그러나 완전성을 위해 답을 남겨 둡니다.
CVn

3
이후 @rush **재귀의 임의의 수준을 일치시킬 수 있습니다 **/*.js작동합니다 sprunge.us/PXQK
크리스 아래

1
일반적으로 사용 for f in ./*.js; do하거나 for f in ./**/*.js; do파일 이름으로 시작하는 파일 이름으로부터 자신을 보호 하는 것이 좋습니다 -(이 경우에는 필요한지 모르겠지만 어쨌든 좋은 습관입니다).
evilsoup
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.