Назад | Перейти на главную страницу

Зацикливание команды на списке аргументов в Linux

Как выполнить ту же команду с аргументами, которые передаются другой командой через канал?

В результате извлечения имен файлов из источника я получаю:

    $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", вероятно, сработает, но есть два подводных камня:

  1. Если имя файла содержит какой-либо символ пробела, оно будет рассматриваться как разделитель, например, имя файла «fuh bar» будет, таким образом, «touch» ed как файл с именем «fuh», а другой файл с именем «bar» вместо single "fuh bar" one. Чтобы облегчить это, вы можете проверить, может ли ваша «some_command» создать другой разделитель, часто NULL (см. Допустимый аргумент «-print0» с командой «find»), и использовать аргумент «--null» в xargs
  2. Если команда ничего не выдаст, xargs потерпит неудачу. Используйте его аргумент "--no-run-if-empty"