使用 Bash 查找和复制文件 [重复]
Posted
技术标签:
【中文标题】使用 Bash 查找和复制文件 [重复]【英文标题】:find and copy file using Bash [duplicate] 【发布时间】:2010-12-06 10:25:28 【问题描述】:任何人都有另一种在 bash 中查找和复制文件的方法,而不是:
find . -ctime -15 | awk 'print "cp " $1 " ../otherfolder/"' | sh
我喜欢这种方式,因为它很灵活,因为我正在构建我的命令(可以通过任何命令)并在之后执行它。
还有其他方法可以将命令简化为文件列表吗?
谢谢
【问题讨论】:
类似问答 1+1/2 年后:***.com/q/5241625/1172302 【参考方案1】:我建议使用find
的-exec
选项:
find . -ctime 15 <b>-exec cp ../otherfolder \;</b>
与往常一样,请查阅手册页以获得最佳结果。
【讨论】:
find 手册页建议在大括号周围使用单引号,因为没有它们可能会被误解。 您应该将\;
替换为+
以避免每次都运行cp
。
@BroSlow 不知道为什么,但这仅适用于 \;并且使用 + 我得到“-exec 缺少参数”。
如果所有文件都具有相同的名称 (im.png
) 怎么办?重命名的时候能不能放到同一个目录下,比如im_1.png
,im_2.png
,im_3.png
...
@user234932 您需要使用另一种方式将目标传递给cp
:find … -exec cp -t <target_directory> +
应该可以工作【参考方案2】:
我一般用这个:
find . -ctime -15 -exec cp ../otherfolder/ \;
【讨论】:
【参考方案3】:您可以使用xargs
:
$ find . -ctime 15 -print0 | xargs -0 -I cp ../otherfolder
另见grep utility in shell script。
【讨论】:
这具有比find -exec
更快的优势,因为它不会为每个文件创建一个新的cp
进程。但是,如果你有 GNU find 你可以使用 find -exec ... +
而不是 find -exec ... ';'
来达到同样的效果:)【参考方案4】:
如果您的 cp
是 GNU 的:
find . -ctime 15 -print0 | xargs --no-run-if-empty -0 cp --target-directory=../otherfolder
【讨论】:
使用这个语法我得到cp: missing operand
。如果我使用@andrey-vlasovskikh (-I -cp otherfolder
) 提供的语法,我不会收到此错误。
更新了答案以涵盖这种情况(当find
没有输出时)。
我喜欢这个。我在查找后添加了| head -z -n 10
以限制我的结果。【参考方案5】:
将此用于复制和许多其他事情:
for f in $(find /apps -type f -name 'foo'); do cp $f $f.bak; cmd2; cmd3; done;
【讨论】:
前面不应该有$吗(find /apps -type f -name 'foo')?谢谢。【参考方案6】:-exec 可能是要走的路,除非你有太多的文件。然后使用 xargs。
【讨论】:
这可能是对已接受回复的评论,也可能是您提到的每种方法的示例。以上是关于使用 Bash 查找和复制文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何复制或删除bash中的特定行并将它们创建到新文件中[重复]