是否可以将find
的结果传递给COPY命令cp
?
像这样:
find . -iname "*.SomeExt" | cp Destination Directory
寻求,我总能找到这种公式such as from this post:
find . -name "*.pdf" -type f -exec cp {} ./pdfsfolder \;
这提出了一些问题:
|
管道?这不是它的用途吗?-exec
|
?答案 0 :(得分:16)
好问题!
- 为什么你不能使用|管?这不是它的用途吗?
醇>
您可以管道,当然,xargs
已针对这些情况完成:
find . -iname "*.SomeExt" | xargs cp Destination_Directory/
- 为什么每个人都推荐-exec
醇>
-exec
很好,因为它可以更准确地控制您正在执行的内容。无论何时管道,都可能存在角点问题:包含空格或新行的文件名等等。
- 我怎么知道何时在管道上使用它(exec) ?
醇>
这取决于你,可能有很多案例。每当要执行的操作很简单时,我都会使用-exec
。我不是xargs
的好朋友,我倾向于选择将find
输出提供给while
循环的方法,例如:
while IFS= read -r result
do
# do things with "$result"
done < <(find ...)
答案 1 :(得分:15)
cp
-t destination
有一个很少使用的选项 - 请参阅手册页:
find . -iname "*.SomeExt" | xargs cp -t Directory
答案 2 :(得分:6)
您可以使用下面的|
:
find . -iname "*.SomeExt" | while read line
do
cp $line DestDir/
done
回答你的问题:
|
可用于解决此问题。但如上所述,它涉及大量代码。此外,|
将创建两个流程 - 一个用于find
,另一个用于cp
。
在exec()
内使用find
将在一个过程中解决问题。
答案 3 :(得分:1)
我喜欢@fedorqui-so-stop-harming 的回应精神,但需要对我的 bash 终端进行调整。
在这个版本中...
find . -iname "*.SomeExt" | xargs cp Destination_Directory/
cp
命令错误地将 Destination_Directory/
作为第一个参数。我需要添加一个替换字符串,以便让 xargs
将参数插入到 cp
的正确位置。我为替换字符串使用了百分比符号,但您可以使用任何与管道输入不冲突的内容。这个版本适合我。
find . -iname "*.SomeExt" | xargs -I % cp % Destination_Directory/
答案 4 :(得分:0)
试试这个:
find . -iname "*.SomeExt" **-print0** | xargs **-0** cp -t Directory
如果文件名中有空格。
答案 5 :(得分:0)
如果文件名中有空格,请尝试:
find . -iname *.ext > list.txt
cat list.txt | awk 'BEGIN {a="'"'"'"}{print "cp "a$0a" Directory"}' > script.sh
sh script.sh
您可以在list.txt
之前检查script.sh
和sh script.sh
。请记住,之后要删除list.txt
和script.sh
。
我有一些带括号的文件,并且需要进度条,所以将cat
行替换为:
cat list.txt | awk -v X='"' '{print "rsync -Pa "X$0X" /Volumes/Untitled/"}' > script.sh
答案 6 :(得分:0)
这解决了我的问题。
find . -type f | grep '\.pdf' | while read line
do
cp $line REPLACE_WITH_TARGET_DIRECTORY
done