Answers:
尝试:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grep
远远超过了-name
参数to中使用的简单外壳模式find
。 xargs
还比的-exec
参数强大find
。
我尝试了Mike建议的命令:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
但最终将所有文件转储到目录中dst
,而它们的相对路径也丢失了。
为了保持相对路径,需要将此命令修改为:
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst
。如果不是这样,请使用cp --parents
。另外,请务必引用文件名。因此:(... | xargs -i cp --parents "{}" dst
请注意,到的最后一个参数cp
现在“仅”是目标目录)。使用-t
标志:可以使命令更短(并且可能更快)... | xargs cp --parents -t dst
。
... | xargs cp {} --parents -t dst.
这样做的另一种方式是这样的:
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cp
过程:... -exec cp -t dst/ {} +
。
-exec
时;
,一次{}
替换为一条路径。cp
每个文件都有一个单独的名称。使用+
语法find
替换{}
多个结果(最多由系统定义的命令行长度限制;限制:{}
必须是之前的最后一件事+
,因此cp -t
)。创建和终止过程是相对昂贵的事情。因此,+
每当您期望获得许多结果时,最好使用它。在这种情况下,复制大量文件可能会花费大量时间,因此差异可能会被忽略。不过,这是个好习惯。
find
可以进行模式匹配并执行命令。有没有必要管其输出:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'