如果复制文件,请避免冲突

时间:2017-02-03 23:46:19

标签: linux bash file find mv

我试图将所有子文件夹中某个文件类型的所有文件复制到一个位置。不幸的是,如果两个文件具有两个不同子文件夹中的相同名称,则可能会导致冲突。

我正在使用

find ./ -name '*.jpg' -exec mv -u '{}' . \; 

如何调整此项以自动重命名文件(例如附加“_1”)以避免冲突。 或者更好:事先检查文件是否相同(例如相同大小)。如果是,请忽略(覆盖也没关系)。如果否,重命名以避免碰撞。

建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以在移动每个单独的文件之前进行检查。在这里,我使用cksum进行比较,它返回文件大小和简单的校验和。

find ./ -name '*.jpg' -print0 |
while read -d '' -r path; do
    file=$(basename "$path")
    if [[ -e $file ]]; then
        if [[ $(cksum "$file" | awk '{print $1 $2}') = $(cksum "$path" | awk '{print $1 $2}') ]]; then
            continue
        fi
        read -n 1 -p "File '$file' would be overwritten by '$path', continue? (y/N) " -r prompt </dev/tty
        if [[ $prompt != [Yy] ]]; then
            continue
        fi
    fi
    mv -f -v "$path" "$file"
done