Как применить ту же команду к списку файлов в Bash?

Я имею в виду некоторые подстановки команд. В прошлом я мог использовать обратные кавычки в Bash, когда, например, мне нужно было загрузить список файлов/ссылок, которые уже были собраны в текстовом файле, построчно:

wget `cat list.txt`

и даже мегадл скачать с меги:

megadl `cat list.txt`

К сожалению, сейчас это не работает, как ожидалось, по какой-то причине. Я получаю весь список файлов в виде длинной строки текста, разделенной пробелами вместо новой строки.

Я часто пишу небольшие скрипты, которые могут обрабатывать только один аргумент — файл, а не список файлов, перечисленных в текстовом файле. Конечно, я не хочу изменять свои сценарии, потому что Bash предоставляет этот вспомогательный механизм для применения одной и той же команды к списку файлов, например, к выводу «ls -1 *.jpg». У меня есть небольшая утилита под названием «cgamma», которая применяет гамма-коррекцию к файлам изображений, сохраняя при этом насыщенность цвета (она просто вызывает mogrify от imagemagick). И я хотел бы использовать его во многих файлах изображений, например:

cgamma `ls -1 *.jpg` 1.3

Я знаю, что мог бы использовать однострочный цикл for, но это больше набирает:

for $i in $(ls -1 *.jpg);do cgamma $i 1.3;done

Итак, мой вопрос: как я могу правильно использовать обратные кавычки, подстановку команд, обрабатывать списки файлов и применять одну и ту же команду ко всем из них?


person Konstantin    schedule 05.07.2015    source источник


Ответы (2)


Вы можете использовать xargs:

printf '%s\0' *.jpg | xargs -0 -I {} cgamma '{}' 1.3
person anubhava    schedule 05.07.2015

На самом деле вы можете сократить свой предполагаемый цикл for, используя bash для выполнения подстановки за вас, а не анализируя вывод ls, которого лучше избегать:

for i in *.jpg; do cgamma "$i" 1.3; done

Это на самом деле короче вашего принятого решения :-)

Кроме того, вы можете использовать GNU Parallel и не только сделать команду короче, но и сделать их все гамма-корректированными параллельно и использовать все те прекрасные ядра Intel, за которые вы заплатили большие деньги ;-)

parallel cgamma {} 1.3 ::: *.jpg
person Mark Setchell    schedule 05.07.2015
comment
Спасибо, я принял ответ xargs, потому что он был для меня новым, я не знал, для чего эта утилита хороша. - person Konstantin; 06.07.2015