2017-02-03 159 views
1

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

我用

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

如何调整这个自动重命名文件(例如追加“_1”),以避免冲突。 或更好:预先检查文件是否相同(例如相同大小)。如果是,忽略(覆盖也可以)。如果否,则重命名以避免碰撞。

建议将不胜感激。谢谢!

+0

而不是EXEC'mv',EXEC'的bash -c为碰撞那么'TEST mv'​​' –

回答

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 
+0

我们可以用'CMP -s',看看两个文件是相同的,而不是两个'cksum's? – codeforester

+0

@codeforester绝对,这将是更好的事情。我最初写了'stat -c%s'来演示OP的想法,但这不是可移植的(它是macOS上的'stat -f%z'),所以我到达了'cksum',它也输出了大小。 – ephemient

+0

好的,这有帮助。但我也想没有任何提示。如果它们相同,我不在乎它是否被覆盖(如果不是,则最好删除要复制的文件)。 但是,如果文件有不同的cksum,它也应该自动重命名,因为我确信我想在这种情况下保留这两个文件。 – StegSchreck