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

Возможно ли передать результаты FIND на команду COPY CP?

Можно ли передать результаты find команде COPY cp?

Вот так:

find . -iname "*.SomeExt" | cp Destination Directory

Ищем, я всегда нахожу такую ​​формулу например, из этого сообщения:

find . -name "*.pdf" -type f -exec cp {} ./pdfsfolder \;

Возникает ряд вопросов:

  • Почему вы не используете только трубку |? это не то, для чего это нужно?
  • Почему все рекомендуют -exec
  • Как узнать, когда использовать этот (exec) over pipe |?
4b9b3361

Ответ 1

Хороший вопрос!

  • почему вы не можете использовать | труба? это не то, для чего это нужно?

Вы можете проехать, конечно, xargs выполняется для этих случаев:

find . -iname "*.SomeExt" | xargs cp Destination_Directory/
  1. Почему все рекомендуют -exec

-exec хорош, потому что он обеспечивает больше контроля над тем, что вы выполняете. Всякий раз, когда вы подключаете, могут быть проблемы с угловыми случаями: имена файлов, содержащие пробелы или новые строки, и т.д.

  1. как узнать, когда следует использовать этот (exec) over pipe |?

Это действительно зависит от вас, и может быть много случаев. Я использовал бы -exec всякий раз, когда действие выполнить просто. Я не очень хороший друг xargs, я предпочитаю подход, в котором вывод find предоставляется в цикле while, например:

while IFS= read -r result
do
    # do things with "$result"
done < <(find ...)

Ответ 2

Там используется небольшая опция cp: -t destination - см. справочную страницу:

find . -iname "*.SomeExt" | xargs cp -t Directory

Ответ 3

Вы можете использовать |, как показано ниже:

find . -iname "*.SomeExt" | while read line
do
  cp $line DestDir/
done

Отвечая на ваши вопросы:

  • | можно использовать для решения этой проблемы. Но, как видно выше, это связано с большим количеством кода. Более того, | создаст два процесса - один для find, а другой для cp.

  • Вместо использования exec() внутри find будет решаться проблема в одном процессе.

Ответ 4

Попробуйте следующее:

find . -iname "*.SomeExt" **-print0**  | xargs **-0** cp -t Directory

Если в именах файлов есть пробелы.