检测具有多个扩展名的文件

检测具有多个扩展名的文件

我有一个运行 Linux 操作系统的 Synology。我在那里传输了很多照片。不幸的是,有些是 .jpg,有些是 .JPG,这取决于我导入时使用的工具。这些在 Synology 上被视为不同,但 Windows 不太喜欢。

因此现在,我尝试检测具有相同名称但扩展名不同的文件,即:“2020-02-13 17.37.08.jpg”和“2020-02-13 17.37.08.JPG”

你有什么聪明的想法吗,因为 a find,与 a while read, ased和一些wc -l包括一些if来排除单个文件听起来一点都不好。

谢谢

编辑:这是一个例子

-rwxrwxrwx+   1 admin users          5815479 Jun 25  2021 2019-02-16 13.40.39.jpg
-rwxrwxrwx+   1 admin users          1759872 Oct 14  2021 2019-02-16 13.40.39.JPG

答案1

没有while readwcif,但使用findsed以及我希望在 Synology shell 中存在的一些其他工具(无论如何,我的似乎存在):

find . -type f -print0 | \
xargs -0n1 basename | \
sed 's/\.[^\.]\+$//' | \
sort | \
uniq -c | \
egrep -v '^      1'

此版本获取目录中文件的名称(这就是其用途basename),删除最后的扩展名,然后对结果进行排序,计算我们在排序列表中找到的每个文件的数量,并排除(egrep -v那些只是无扩展名文件名的一个实例的文件。-print0与的组合xargs -0是通过告诉两个命令使用空字符而不是换行符来处理名称中的空格,以将路径/文件名彼此分隔开。

例如,这还将列出同时具有.jpg和扩展名的文件。.mov

如果您不想跨子目录查找匹配项,您可以尝试这种(类似的)方法:

find . -type f -print | \
sed 's/\.[^\.]\+$//' | \
sort | \
uniq -c | \
egrep -v '^      1'

这些都是相当短的单行代码,仅分散在多行上以便于(您)阅读。

例子:

$ ls -lR dir2/
dir2/:
total 0
-rw-r--r--. 1 userid unixusers 0 Jun 28 19:29 2020-02-13 17.37.08.JPG
-rw-r--r--. 1 userid unixusers 0 Jun 28 19:29 2020-02-13 17.37.08.jpg

$ find . -type f -print | sed 's/\.[^\.]\+$//' | sort | uniq -c | egrep -v '^      1'
      2 ./dir2/2020-02-13 17.37.08

或者,跨不同的目录:

./dir1:
total 0
-rw-r--r--. 1 userid unixusers 0 Jun 28 19:29 2020-02-13 17.37.08.JPG

./dir2:
total 0
-rw-r--r--. 1 userid unixusers 0 Jun 28 19:29 2020-02-13 17.37.08.jpg

输出结果如下:

$ find . -type f -print0 | xargs -0n1 basename | sed 's/\.[^\.]\+$//' | sort | uniq -c | egrep -v '^      1'
      2 2020-02-13 17.37.08

相关内容