我有一个运行 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 read
,wc
或if
,但使用find
,sed
以及我希望在 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