【问题标题】:find and copy file using Bash [duplicate]使用 Bash 查找和复制文件 [重复]
【发布时间】:2010-12-06 10:25:28
【问题描述】:

任何人都有另一种在 bash 中查找和复制文件的方法,而不是:

find . -ctime -15 | awk '{print "cp " $1 " ../otherfolder/"}' | sh

我喜欢这种方式,因为它很灵活,因为我正在构建我的命令(可以通过任何命令)并在之后执行它。

还有其他方法可以将命令简化为文件列表吗?

谢谢

【问题讨论】:

标签: linux bash copy find


【解决方案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 您需要使用另一种方式将目标传递给cpfind … -exec cp -t &lt;target_directory&gt; {} + 应该可以工作
【解决方案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。

    【讨论】:

    • 这可能是对已接受回复的评论,也可能是您提到的每种方法的示例。
    猜你喜欢
    • 2015-05-09
    • 2013-11-02
    • 1970-01-01
    • 2021-05-12
    • 2011-07-11
    • 2017-07-24
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    相关资源
    最近更新 更多