【问题标题】:Avoid collision, if copying files避免碰撞,如果复制文件
【发布时间】:2017-02-03 23:46:19
【问题描述】:

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

我正在使用

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

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

建议将不胜感激。谢谢!

【问题讨论】:

  • 而不是exec mv,exec bash -c ' TEST FOR CLASH then mv'

标签: linux bash file find mv


【解决方案1】:

您可以在移动每个单独的文件之前进行检查。这里我使用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

【讨论】:

  • 我们可以使用cmp -s 来查看两个文件是否相同而不是两个cksums 吗?
  • @codeforester 当然,这将是更好的做法。我最初写了stat -c %s 来展示OP 的想法,但这不是可移植的(它在macOS 上是stat -f %z)所以我到达了cksum,它也输出大小。
  • 好的,这有帮助。但我也想根本没有提示。如果它们相同,我不在乎它是否被覆盖(如果没有,最好删除要复制的文件)。但是如果文件有不同的 cksum,它也应该自动重命名,因为我确信在这种情况下我想保留这两个文件。
猜你喜欢
  • 2012-11-27
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
相关资源
最近更新 更多