【问题标题】:Linux find and copy files with same name to destination folder do not overwriteLinux查找并复制具有相同名称的文件到目标文件夹不会覆盖
【发布时间】:2016-07-29 03:26:56
【问题描述】:

我想在一个文件夹中查找并复制所有带有*.jpg 的文件,包括其子文件夹到另一个文件夹 我用

find /tempL/6453/ -name "*.jpg" |  xargs  -I  '{}' cp {} /tempL/;

但它会覆盖同名文件

例如在/tempL/6453/中,有test (1).jpgtest (2).jpg和文件夹1,在/tempL/6453/1/中也有同名文件test (1).jpgtest (2).jpg

如果我使用上面的命令,test (1).jpgtest (2).jpg/tempL/中只有两个文件,它不能将所有文件都复制到/tempL/

我想要的是将所有文件复制到/tempL/,当有相同的文件名时,只需重命名它们,如何?

【问题讨论】:

  • cp *.jpg PUT_DESTINATION_PATH
  • @OmidCompSCI 请仔细阅读问题。诚然,它的措辞可以更好,但很明显,OP 想要重命名任何源目录中具有相同名称的文件。您的建议不会重命名,也不会递归源子目录。
  • @kaylum,抱歉没有 100% 理解它,也不确定递归,但它不会使用 -r 吗?
  • @OmidCompSCI -r 确实适用于递归目录。但除非源是目录,否则它没有效果。 *.jpg 不是目录。如果你不明白这个问题,那么最好先要求澄清。
  • @kaylum 啊,明白了,谢谢你的澄清。抱歉,我无法回答这个问题,但我期待看到答案!

标签: linux find cp


【解决方案1】:

我想要的是将所有文件复制到/tempL/,当有相同的文件名时,只需重命名它们,如何?

1) 如果你只是不覆盖cp --backup 会给你一个现有文件的备份,使用cp--suffix 选项,你也可以指定用于备份的后缀。

2) cp--parents 选项将保留目录树,即文件夹 1 中的文件将被复制到新创建的 1 文件夹中。

3) 如果你想自定义你的重命名处理,你不能只使用cp 命令。为它编写脚本并调用它来处理find的结果

【讨论】:

    【解决方案2】:

    安装“GNU 并行”并使用:

    find /tempL/6453/ -name "*.jpg" | parallel 'cp {} ./dest-dir/`stat -c%i {}`_{/}'
    
    {/}  ................. gets filename with no full path
    

    我认为 xargs 应该可以使用相同的方法,但是学习并行对我来说非常棒,它为我们提供了许多漂亮的解决方案。

    我建议在cp 之前使用echo 来测试您的命令

    【讨论】:

    • 也试试--dry-run 而不是echo。它也适用于像 'seq 10 | 这样的命令。并行'ls {} || echo 未找到 {}'`
    猜你喜欢
    • 2020-09-23
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2022-11-25
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多