複数のファイルでコマンドを実行する方法


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ファイルを上書きする必要があるため、おそらくこれを利用してすべての名前を変更できます
Mataniko

--jsと--js_output_fileを異なるものにする必要がある場合は、ファイル名をパラメーターとして使用する2行のスクリプトを作成し、出力を一時ファイルに書き込みmv、ファイルを元の名前で書き込みます。
Anthon 2013年

別のスクリプトの作成を避けたい場合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 2013年

find -exec単純なコマンドに最適です。複雑なものの方find | xargsがはるかに優れており、コマンドを並行して実行することもできます。
ラッシュ

@rush xargsはなぜ良いのか説明しますか?
Mel Boyce

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 2013年

1
おお、なんとかして「いくつかのサブフォルダー」の部分を完全に見逃してしまいました。ごめんなさい。ただし、完全を期すために答えは残しています。
CVn 2013年

3
@rush **任意のレベルの再帰に一致できるため、**/*.js機能します:sprunge.us/PXQK
Chris Down

1
を使用するfor f in ./*.js; dofor f in ./**/*.js; do、ファイル名をaで始まるファイルから保護することは、一般的には良い考え-です(この場合、それが必要かどうかはわかりませんが、とにかく良い習慣です)。
evilsoup 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.