Linux 是否可以将FIND的结果通过管道传输到COPY命令CP?
是否可以将Linux 是否可以将FIND的结果通过管道传输到COPY命令CP?,linux,shell,terminal,find,xargs,Linux,Shell,Terminal,Find,Xargs,是否可以将find的结果通过管道传输到COPY命令cp 像这样: find . -iname "*.SomeExt" | cp Destination Directory 寻找,我总是发现这样的公式: 这引起了一些问题: 你为什么不能直接使用管道呢?这不是它的目的吗 为什么每个人都推荐-exec 我如何知道何时通过管道使用(exec)| 您可以像下面这样使用|: find . -iname "*.SomeExt" | while read line do cp $line DestDir/
find
的结果通过管道传输到COPY命令cp
像这样:
find . -iname "*.SomeExt" | cp Destination Directory
寻找,我总是发现这样的公式:
这引起了一些问题:
-exec
|
您可以像下面这样使用
|
:
find . -iname "*.SomeExt" | while read line
do
cp $line DestDir/
done
回答您的问题:
可用于解决此问题。但是如上所述,它涉及大量代码。此外,|
将创建两个进程-一个用于|
,另一个用于查找
cp
- 相反,在
内部使用find
将在单个进程中解决问题exec()
- 你为什么不能用烟斗呢?这不是它的目的吗 当然,您可以对这些情况使用管道,
- 问得好
xargs
:
find . -iname "*.SomeExt" | xargs cp Destination_Directory/
-exec
很好,因为它提供了对执行内容的更多控制。无论何时使用管道,角落案例可能会出现问题:包含空格或新行的文件名,等等
-exec
。我不是xargs
的好朋友,我倾向于选择将find
输出提供给while
循环的方法,例如:
while IFS= read -r result
do
# do things with "$result"
done < <(find ...)
而IFS=读取-r结果
做
#使用“$result”进行操作
完成<对于cp
:-t destination
——请参见手册页:
find . -iname "*.SomeExt" | xargs cp -t Directory
试试这个:
find . -iname "*.SomeExt" **-print0** | xargs **-0** cp -t Directory
如果文件名中有空格。如果文件名中有空格,请尝试:
find . -iname *.ext > list.txt
cat list.txt | awk 'BEGIN {a="'"'"'"}{print "cp "a$0a" Directory"}' > script.sh
sh script.sh
您可以在sh script.sh
之前检查list.txt
和script.sh
。记得在之后删除list.txt
和script.sh
我有一些带括号的文件,需要一个进度条,因此将cat
行替换为:
cat list.txt | awk-vx='''''''{print“rsync-Pa”X$0X'/Volumes/Untitled/“}>script.sh
这解决了我的问题
find . -type f | grep '\.pdf' | while read line
do
cp $line REPLACE_WITH_TARGET_DIRECTORY
done
我喜欢@fedorqui的响应精神,所以不要再伤害我了,但它需要在我的bash终端中进行调整
在这个版本中
find . -iname "*.SomeExt" | xargs cp Destination_Directory/
cp
命令错误地将Destination\u Directory/
作为第一个参数。我需要添加一个替换字符串,以便获得xargs
以将参数插入到cp
的正确位置。我为替换字符串使用了百分比符号,但您可以使用与来自管道的输入。这个版本适合我
find . -iname "*.SomeExt" | xargs -I % cp % Destination_Directory/
cp
不接受stdin afaik。可能的重复。假设您的find
有-exec…++
并且您通过管道/xargs保护您的文件名,那么您使用哪一个并不重要。如果您的find
没有-exec…++/code>,那么任何co都应该首选谨慎的管道/xargs可以接受多个文件名参数的mmand。这对我不起作用,需要将-t标志添加到cp命令才能起作用
find . -iname "*.SomeExt" | xargs -I % cp % Destination_Directory/