删除重复文件

删除重复文件

在我的 Mac OS X 10.6.7 上,iTunes 复制了我的音乐库中的每个文件。现在我有 3,840 个文件,而不是 1,920 个。问题在于 iTunes 并不简单地复制整个文件夹,而是复制每个文件夹中的每个文件,并1在副本中添加 .它看起来像这样:

├── album1
│   ├── track1.mp3
│   ├── track1 1.mp3
│   ├── track2.mp3
│   └── track2 1.mp3
└── album2
    ├── track1.m4a
    └── track1 1.m4a

现在,我不想点击 1,920 个重复项,而是想在终端中输入一些智能行来删除多余的文件:

find path/to/music/ -name "* 1.*" -delete

尽管这在大多数情况下都有效,但在以下情况下会弄乱事情:

└── album2
    ├── track 1.mp3
    └── track 1 1.mp3

也许我应该排除"* 1 1.*"并稍后重命名这些文件,删除多余的文件1

我该怎么做呢?

有一个简单的解决方案吗?

答案1

我还要添加它以成功找到(并删除)精确的文件重复,您必须通过哈希值比较文件:

#!/bin/sh -eu
find "${1:-.}" -type f ! -empty -print0 | xargs -0 md5 -r | \
    awk '$1 in a{sub("^.{33}","");printf "%s\0",$0}a[$1]+=1{}' | \
    xargs -0 rm -v --

将其另存为deldupes.sh并运行它,并将目录名作为第一个参数(否则$PWD将使用)。

在 OS X 上测试,适用于长空白文件名。

答案2

像这样的东西,没有测试过;它是在 bash 中,所以你可能需要转换一些语法:

IFS=$'\n'              # so that only newlines separate words, not spaces
set -f                 # disable globbing
FILES=$(find path/to/music/ -name "* 1.*")

for FILE in ${FILES}; do
    if [[ -f "${FILE% 1.*}" ]] ; do
        echo "Matched ${FILE}."
        # rm "${FILE}" # Uncomment me once you have confirmed it would do what you intend.
    fi
done

${FILE% 1.*}1.*从末尾删除最后一个匹配的语法,[[ -f ... ]]检查该文件是否存在;因此,它将删除那些末尾没有语法的文件所存在的文件。请在取消注释之前进行测试rm,以确保其正确。

相关内容