Вывод команды 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стереть результат, возвращенныйfindto; подумайте о{}где каждый результат поиска идет. -
';': используется для разделения различных команд для запуска после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 аргумент вместо труб.