bash - 查找所有具有相同名称的文件,无论扩展名如何

bash - 查找所有具有相同名称的文件,无论扩展名如何

我正在合并两个电影库,并希望通过 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 问题需要缓解。

比较两个文件大小并删除较小的文件

相关内容