Как подключить вывод grep к cp?

У меня есть рабочая команда grep, которая выбирает файлы, удовлетворяющие определенному условию. Как я могу взять выбранные файлы из команды grep и передать ее в команду cp?

В конце cp не удалось выполнить следующие попытки:

grep -r "TWL" --exclude=*.csv* | cp ~/data/lidar/tmp-ajp2/

cp: отсутствует операнд файла назначения после '/Home/ubuntu/data/lidar/tmp-ajp2/Попробуйте' cp --help 'для получения дополнительной информации информация.


cp `grep -r "TWL" --exclude=*.csv*` ~/data/lidar/tmp-ajp2/

cp: неверный параметр - '7'

Ответ 1

grep -l -r "TWL" --exclude=*.csv* | xargs cp -t ~/data/lidar/tmp-ajp2/

Пояснение:

  • grep -l возможность выводить только имена файлов
  • xargs для преобразования списка файлов из стандартного ввода в аргументы командной строки
  • cp -t опция указать целевой каталог (и избежать использования заполнителей)

Ответ 2

вам понадобится xargs с опцией placeholder:

grep -r "TWL" --exclude=*.csv* | xargs -I '{}' cp '{}' ~/data/lidar/tmp-ajp2/

обычно, если вы используете xargs, он будет вывести команду после, с помощью заполнителя ('{}' в этом случае), вы можете выбрать место, где оно вставлено, даже несколько раз.

Ответ 3

Чтобы скопировать файлы в найденные каталоги grep, используйте -printf для вывода каталогов и -i, чтобы поместить аргумент команды из xarg (after pipe)

find ./ -name 'filename.*' -print '%h\n' | xargs -i cp copyFile.txt {}

копирует copyFile.txt во все каталоги (в./), содержащие "filename"

Ответ 4

grep -rl '/directory/' -e 'pattern' | xargs cp -t/directory