如何对多个文件运行命令

Mat*_*iko 16 command-line shell bash recursive wildcards

这是非常基本的,我有一个文件夹,其中包含几个 JS 文件的子文件夹,我想对这些文件夹中的所有文件运行 Google 的 Clojure 编译器。处理单个文件的命令如下:

java -jar compiler.jar --js filename.js --js_output_file newfilename.js
Run Code Online (Sandbox Code Playgroud)

如何修改它以在我的目录结构中的每个 JS 文件上运行?

Ant*_*hon 16

您可以使用find

find . -name "*.js" -exec java -jar compiler.jar --js {} --js_output_file new{} \;
Run Code Online (Sandbox Code Playgroud)


use*_*ser 10

您还可以使用简单for循环,尤其是当文件位于单个目录(无子目录)中时。也可以修改它以使用子目录。

没有递归:

for filename in ./*.js
do
    java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"
done
Run Code Online (Sandbox Code Playgroud)

或作为等效的单线:

for filename in ./*.js; do java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"; done
Run Code Online (Sandbox Code Playgroud)

递归到子目录(需要 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
Run Code Online (Sandbox Code Playgroud)

  • @rush 由于`**` 可以匹配任意级别的递归,`**/*.js` 有效:http://sprunge.us/PXQK (3认同)