我已经解决过所有类似的问题并安装了一些像 duff 这样的命令行实用程序,但没有成功。
在我的 Images 目录中,我有一些同名但扩展名不同的图像(jpg 和 png)。我只想打印具有不同扩展名的重复文件名的文件名。(例如 foo.jpg 和 foo.png)或者至少一个文件名(foo)
到目前为止我尝试过这些方法
find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq
find . -type f \( -name "*.jpg" -o -name "*.png" \)
这些命令中的大多数都返回没有什么或者所有文件或者独特的文件名,但不是重复的。
答案1
我建议修改你的第二个命令:
find . -type f -name "*.jpg" | \
while read -r f; do [ -e "${f%.jpg}.png" ] && echo "${f%.jpg}"; done
这将查找所有.jpg
文件并检查相应.png
文件是否存在,并显示不带扩展名的完整路径。
请注意,如果文件数量少很多,.png
搜索这些文件并检查相应的.jpg
文件会更有效率。
[已bash
在 Ubuntu 18.04.1 上测试。]
答案2
我接受并感谢你的回答。同时,我得到了这个 python 脚本,它的工作方式与我所寻找的有些接近。我试图找到源代码,但在我搜索的 100 个标签中找不到它。
#!/usr/bin/env python
# Syntax: duplicates.py DIRECTORY
import os, sys
top = sys.argv[1]
d = {}
for root, dirs, files in os.walk(top, topdown=False):
for name in files:
fn = os.path.join(root, name)
basename, extension = os.path.splitext(name)
basename = basename.lower() # ignore case
if basename in d:
print(d[basename])
print(fn)
else:
d[basename] = fn
将此文件保存为 duplicates.py 并赋予权限,然后在文件夹上执行它。
./duplicates.py Images
答案3
您必须使用uniq -c
来获取计数,然后在最后进行反向排序以首先列出重复项。最后awk
用于筛选以 2 或更高开头的行。
$ find . -type f -exec sh -c 'basename ${0%.*}' {} \; | sort | uniq -c | sort -r | awk 'int($1)>=2'
2 foo
这里,%.*
去掉扩展名,所以foo.x.y
变成foo.x
。
除了使用简单的来查找所有文件之外,您还可以像在第二个命令中一样find . -type f
过滤*.jpg
或文件。*.png