Подтвердить что ты не робот

Об использовании команды linux "xargs"

У меня есть файл вроде

love.txt  
loveyou.txt 

в каталоге useful; Я хочу скопировать этот файл в каталог /tmp.

Я использую эту команду:

find ./useful/ -name "love*" | xargs cp /tmp/

но не работает, просто говорит:

cp: target `./useful/loveyou.txt' is not a directory

когда я использую эту команду:

 find ./useful/ -name "love*" | xargs -i cp {} /tmp/

он отлично работает,

Я хочу знать, почему второй работает, и больше об использовании -i cp {}.

4b9b3361

Ответ 1

xargs помещает слова, поступающие со стандартного ввода в конец списка аргументов данной команды. Поэтому первая форма создает

cp /tmp/ ./useful/love.txt ./useful/loveyou.txt

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

Опция -i сообщает xargs обрабатывать один файл за раз, заменяя {} своим именем, поэтому оно эквивалентно

cp ./useful/love.txt    /tmp/
cp ./useful/loveyou.txt /tmp/

Что явно работает хорошо.

Ответ 2

При использовании команды xargs -i {} заменяется на каждый найденный вами элемент. Итак, в вашем случае для "loveyou.txt" и "love.txt" будет выполняться следующая команда:

cp ./useful/loveyou.txt /tmp/
cp ./useful/love.txt /tmp/

если вы опустите {}, все элементы, которые вы найдете, будут автоматически вставлены в конце команды, поэтому вы выполните бессмысленную команду:

cp /tmp/ ./useful/loveyou.txt ./useful/love.txt

Ответ 3

Первый пример будет делать следующее:

cp /tmp/ love.txt loveyou.txt

Это невозможно сделать, поскольку они пытаются скопировать каталог /tmp и файл love.txt в файл loveyou.txt.

Во втором примере -i сообщает xargs заменить каждый экземпляр {} на аргумент, поэтому он будет делать:

cp love.txt /tmp/
cp loveyou.txt /tmp/

Ответ 4

xargs добавляет значения, которые подаются как поток в конец команды - он не запускает команду один раз на входное значение. Если вы хотите, чтобы одна и та же команда выполнялась несколько раз - вот что такое синтаксис -i cp {}.

Это хорошо работает для команд, которые принимают список аргументов в конце (например, grep). К сожалению, cp не является одним из них - он рассматривает аргументы, которые вы передаете, в качестве каталогов для копирования, что объясняет, что "не является ошибка каталога.

Ответ 5

find ./useful/ -name "love*" | xargs cp -t /tmp/

Ответ 6

Вы могли бы избежать так называемых xargs:

find ./useful/ -name "love*" -exec sh -c 'cp "[email protected]" /tmp' sh {} +