Как выполнить ту же команду с аргументами, которые передаются другой командой через канал?
В результате извлечения имен файлов из источника я получаю:
$some_command filename1 filename2 filename3 ... filenameN
Я хотел бы создать файлы с этими именами файлов с помощью touch
. Как я могу зациклить touch
над этими именами?
Вы можете использовать xargs с -n1, чтобы запустить команду один раз для каждого переданного аргумента
$some_command | xargs -n 1 touch
Однако в случае касания, которое принимает несколько аргументов
touch `$some_command`
вероятно будет работать на вас.
Я использую только для ... делать ... для очень простых случаев.
Для более сложных / опасных сценариев:
command | sed 's/^/touch /'
Это ничего не делает, кроме печати предполагаемых команд. Просмотрите результаты, затем выполните то же самое, подключив трубопровод к sh -x
(в -x
флаг предназначен для отладки):
command | sed 's/^/touch /' | sh -x
for i in `$some_command`; do touch $i; done
Если в именах файлов есть пробелы, их можно обойти следующим образом:
some_command | while read filename ; do touch "$filename" ; done
Это создаст файлы с именами:
имя файла 1
имя файла 2
названный файл 3
и т.д
Если, конечно, он производит эти имена.
"some_command | xargs touch", вероятно, сработает, но есть два подводных камня: