Как я выполняю команду на нескольких файлах

Иначе при помощи (относительно) нового интерфейса ядра, названного cgroups (статья Википедии здесь). Это позволяет более мелкомодульное управление того, сколько cpu/memory/io/etc процессу/пользователю/группе позволяют использовать.

11
28.06.2013, 01:37
2 ответа

Можно использовать find:

find . -name "*.js" -exec java -jar compiler.jar --js {} --js_output_file new{} \;
12
27.01.2020, 19:57
  • 1
    Спасибо, и я могу, вероятно, усилить это для переименования всего, потому что исходные файлы JS должны быть перезаписаны –  Mataniko 27.06.2013, 11:00
  • 2
    В случае, если - js и - js_output_file должен отличаться, я сделал бы сценарий с двумя строками, который берет имя файла в качестве параметра, запишите вывод во временный файл и mv файл к настоящему имени. –  Anthon 27.06.2013, 11:07
  • 3
    Если Вы не хотите создавать отдельный сценарий 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 27.06.2013, 11:17
  • 4
    find -exec является большим для простых команд. для сложных find | xargs намного лучше, и также это позволяет командам выполнения параллельно. –  rush 27.06.2013, 11:22
  • 5
    @rush, возможно, объясняет почему xargs лучше? –  Mel Boyce 27.06.2013, 15:39

Можно также использовать простое 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 колотит 4.0, или более новый) (благодарит @ChrisDown):

shopt -s globstar
for filename in ./**/*.js; do
    java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"
done
7
27.01.2020, 19:57
  • 1
    Это не рекурсивно вызывает подкаталоги, как спросили в вопросе. С bash4 +, можно использовать globstar сделать так. –  Chris Down 27.06.2013, 10:58
  • 2
    Да, это - хороший ответ и великое для знания, но другой ответ делает точно, к чему я нуждаюсь в нем. –  Mataniko 27.06.2013, 11:01
  • 3
    Ohh, мне удалось полностью пропустить "несколько подпапок" часть.Прошу прощения. Разбрасывание ответа для пользы полноты, все же. –  a CVn 27.06.2013, 11:06
  • 4
    @rush С тех пор ** может соответствовать произвольному уровню рекурсии, **/*.js работы: sprunge.us/PXQK –  Chris Down 27.06.2013, 12:02
  • 5
    Это обычно - хорошая идея использовать for f in ./*.js; do или for f in ./**/*.js; do для защиты себя от имен файлов, начинающихся a - (Я не знаю, необходимо ли это в этом случае, но это - хорошая привычка так или иначе). настройки –  evilsoup 27.06.2013, 19:01

Теги

Похожие вопросы