我正在合并两个电影库,并希望通过 bash 脚本手动“去重复”。
到目前为止,这是我的思考过程:
- 查找所有具有相同名称的文件,无论扩展名如何
- 删除较小的文件(我有几天的存储空间!并且更喜欢质量!)
我可以在此基础上进行构建,因此如果我能以某种方式将删除部分分开,我就可以在此基础上进行构建。我虽然可以使用 ffmpeg 检查视频并选择更好的视频,但我猜测更大的尺寸 = 最佳选择并且更易于编码。
我发布了 Software Rec但没有得到我想要的,所以我意识到 bash 是我最好的选择,但我的“查找”知识是有限的,我找到的大多数答案都很复杂,我认为这应该是一件简单的事情。
答案1
这是我写的一个很好的方法,只查找重复文件而忽略扩展名:
find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated
然后我将其包含在这个循环中,以查找每个文件中较小的两个文件:
for i in $(find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated); do find . -name "$i*" -printf '%s %p\n' | sort -n | head -1 | cut -d ' ' -f 2-; done
最后再进行一次循环(以交互方式,rm -i
因此每个循环之前都会有提示)删除所有这些文件:
for j in $(for i in $(find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated); do find . -name "$i*" -printf '%s %p\n' | sort -n | head -1 | cut -d ' ' -f 2-; done); do rm -i "$j"; done
由于这涉及find
对目录执行两次操作,因此肯定有更好的方法。但这应该适用于简单的情况。它还假设您正在当前目录中工作,如果您想在不同的目录上执行该命令,只需更改.
这两个find
命令的参数即可。
答案2
由于我需要排除 .srt 文件的问题,我最终是如何做到这一点的。
查找具有相同名称但不同扩展名的文件:
ls * | sed 's/.\{4\}$//' | sort | uniq -d
注意:这取决于扩展名是否为 4 个字符,例如.XYZ
,它不适用于 mpeg,但我所有的电影都是 mp4/mkv/m4v。
忽略 .srt 文件:
ls * | awk '!/.srt/' | sed 's/.\{4\}$//' | sort | uniq -d
我发布了一个单独的线程来比较文件大小,但 Harrys Answer 做得很好,除了我意识到我有 .srt 问题需要缓解。