【问题标题】:How can I copy files recursively without overwriting duplicate file names?如何递归复制文件而不覆盖重复的文件名?
【发布时间】:2016-01-31 23:25:51
【问题描述】:

假设我有嵌套在子目录中的文件,其文件名可能重复。我想将所有文件复制到一个新目录但防止覆盖并保留文件名(大部分)。

以下不起作用,因为它会覆盖重复的文件名:

find /SourceDir/. -type f -exec cp -pv \{\} /DestDir/ \;

添加noclobber (cp -n) 也无济于事,因为只是跳过了重复项。

当前文件结构:

SourceDir
--SubdirA
----File1.gif
---- ...
----File1000.jpg
--SubdirB
----File1.gif
---- ...
----File1000.png
...
--SubdirZ
----SubdirAA
------File1.sh
------ ...
------File1000.jpg

所需的文件结构:

DestDir
--File1.gif
--File1_1.gif   <-- original name was `File1.gif` but this already existed
--File2.jpg
--File2.gif     <-- `File2.jpg` already exists, but not `File2.gif`
--File3.gif
--File3_1.gif
--File4.jpg
--File4_1.jpg
--File4_2.jpg   <-- original name was `File4.jpg`, but `File4_1.jpg` already existed too.
-- ...
--File1000.png

不想重命名每个文件。而且我不想给我需要复制的那些任意散列。你有什么推荐的?

我在 Mac 上,所以 Linux 命令都是公平的游戏。

【问题讨论】:

    标签: bash shell find rename cp


    【解决方案1】:

    这是一种解决方案。

    #!/bin/bash
    
    SourceDir=".";
    DestDir="../dest";
    
    cd ${SourceDir}
    find .  -type f |
    while read x
    do
      bn=`basename $x`;
      if [ -f "${DestDir}/$bn" ]
      then
        for i in {1..9999}
        do
            if [ ! -f "${DestDir}/${bn%.*}_${i}.${bn##*.}" ]
            then
                echo "Next free file extension is no $i";
                bn="${DestDir}/${bn%.*}_${i}.${bn##*.}"
                break;
            fi
        done
      fi
      echo "copy file $x to ${DestDir}/$bn";
      cp -p "$x" "${DestDir}/$bn";
     done
    

    如果这对你有用,请告诉我。

    【讨论】:

    • 酷。谢谢。 if [ ! -f ../dest/$bn ] 行返回 too many arguments。你能推荐一个替代方案吗?
    • 对不起,我会改变它,这样它也会复制重复项
    • @Ryan ,如果有更改我的答案。因此,如果文件存在,它会扩展文件名 file_[1..9999]
    • 将此行 if [ -f ${DestDir}/$bn ] 更改为 if [ -f "${DestDir}/$bn" ]乙>。那么您是否有可能在文件名中有一个空格的文件
    • 是的,它只(我希望)多改变一行 cp -p "$x" "${DestDir}/$bn"; 。我已经更改了答案中的两行
    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多