OSX 命令行查找具有不同扩展名的重复文件名

OSX 命令行查找具有不同扩展名的重复文件名

我已经解决过所有类似的问题并安装了一些像 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

相关内容