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

Fre*_*ers 2 bash find

我正在合并两个电影库,并希望通过 bash 脚本手动“删除重复”。

到目前为止,这是我的思考过程:

  • 无论扩展名如何,查找所有具有相同名称的文件
  • 删除较小的文件(我有几天的存储空间!更喜欢质量!)

我可以以此为基础,所以如果我能以某种方式将删除部分分开,我就可以在此基础上进行构建。虽然我可以使用 ffmpeg 来检查视频并选择更好的视频,但我猜测更大的尺寸 = 最佳选择并且更易于编码。

我发布了 Software Rec,但没有得到我想要的东西,所以我意识到 bash 是我最好的选择,但是我的“查找”知识有限,而且我找到的大多数答案都很复杂,我认为这应该是一个简单的事物。

例如:查找名称相同但内容不同的文件?

Har*_*rry 5

这是我写的一种很好的方法,可以找到忽略扩展名的重复文件:

find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated
Run Code Online (Sandbox Code Playgroud)

然后我将它包装在这个循环中,为每个文件找到两个文件中较小的一个:

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
Run Code Online (Sandbox Code Playgroud)

最后再循环一次(交互地,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
Run Code Online (Sandbox Code Playgroud)

由于这涉及find在您的目录上执行两个s,因此肯定有更好的方法。但这应该适用于简单的情况。它还假设您在当前目录下工作,如果您想在不同的目录上执行命令,只需将.参数更改为两个find命令即可。