Вывод команды 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
аргумент вместо труб.