Вывод команды Linux в качестве параметра другой команды

Я хотел бы передать список выходных элементов команды в качестве параметра другой команды. Я нашел еще несколько страниц:

  • как отобразить вывод команды Linux на stdout, а также передать его другой команде?
  • используйте вывод команды bash (с трубой) в качестве параметра для другой команды

но они кажутся более сложными.

Я просто хотел бы скопировать файл в каждый результат вызова Linux

3 ответов


это то, что вы хотите:

find . -name myFile -exec cp /home/myuser/myFile {} ';'

разбивка / объяснение этого:

  • find: вызов команды find
  • .: начать поиск из текущего рабочего каталога.
  • поскольку флаги глубины не указаны, это будет рекурсивно искать все подпапки
  • -name myFile: поиск файлов с явным именем myFile
  • -exec: для результатов поиска выполните дополнительные команды с помощью их!--18-->
  • cp /home/myuser/myFile {}: копии /home/myuser/myFile стереть результат, возвращенный find to; подумайте о {} где каждый результат поиска идет.
  • ';': используется для разделения различных команд для запуска после find

есть несколько способов решить эту проблему, в зависимости от того, нужно ли вам беспокоиться о файлах с пробелами или другими специальными символами в их именах.

если ни одно из имен файлов не имеет пробелов или специальных символов (они состоят только из букв, цифр, тире и подчеркивания), то следующее простое решение, которое будет работать. Вы можете использовать $(command) выполнить команду, и подставить результаты в аргументы другой команды. Раковина разделит результат на пробелах, вкладках или новых строках и for присвоить каждому значению $f по очереди и выполните команду для каждого значения.

for f in $(find . -name myFile)
do
    cp something $f
done

если у вас есть пробелы или табуляции, вы можете использовать найти тут . Вы проходите -exec command args, поставив {} где вы хотите, чтобы имя файла было заменено, и заканчивая аргументы с ;. Вам нужно процитировать {} и ; чтобы оболочка не интерпретировала их.

find . -name myFile -exec cp something "{}" \;

иногда -exec не достаточный. Например, в этот вопрос, они хотели использовать расширение параметра Bash для вычисления имени файла. Для того чтобы сделать это, вам нужно пройти -exec bash -c 'your command', но тогда вы столкнетесь с проблемами цитирования с {} замена. Чтобы решить эту проблему, вы можете использовать -print0 С find чтобы напечатать результаты, разделенные нулевыми символами (которые недопустимы в именах файлов), и передать его в while read цикл, который разбивает параметры на нули:

find . -name myFile -print0 | (while read -d $'' f; do
    cp something "$f"
  done)

труба отправит выход одной программы на вход другой. cp не читает из входного потока на терминале, он просто использует аргументы командной строки.

вы хотите использовать xargs с трубой или find ' s exec аргумент вместо труб.