![按文件名查找重复项](https://linux22.com/image/1130711/%E6%8C%89%E6%96%87%E4%BB%B6%E5%90%8D%E6%9F%A5%E6%89%BE%E9%87%8D%E5%A4%8D%E9%A1%B9.png)
我在单个文件夹中大约有 167k 个文件(目前),并使用此脚本重命名:重命名一堆文件,但仅重命名部分标题。
如何通过名称(仅限特定位置的数字)查找重复的文件并删除最旧的文件:
Aaaaaaa.bbb - 0000125 tag tag_tag 9tag Aaaaaaa.bbb - 0000002 tag 9tag Aaaaaaa.bbb - 0000002 tag tag_tag 9tag
我使用的所有工具都没有提供这样的功能,所以只有脚本可以提供帮助。
答案1
下面是find
,sort
和awk
单行代码。
基本思想是列出文件,按数字顺序对它们进行排序(这是可行的,除非 Aaaaaaa.bbb 和标签本身是数字),然后让 awk 将文件名的每个第 3 个字段存储到prev
变量中,并将其与字段 3 的当前值进行比较。如果它们匹配,则打印一条消息。
find . -type f -print | sort --numeric | awk '{if(prev == $3) print $0" is duplicate of "$prevEntry}{ prev=$3; prevEntry=$0}'
下面是一个小的演示:
$ seq 6 10 | xargs printf "%07d\n" | xargs -I {} touch "Aaaaaaa.bbb - {} tag 9tag"
$ seq 00001 00020 | xargs printf "%07d\n" | xargs -I {} echo "Aaaaaaa.bbb - {} tag tag_tag 9tag"
$ find . -type f -print | sort --numeric | awk '{if(prev == $3) print $0" is duplicate of "$prevEntry}{ prev=$3; prevEntry=$0}'
./Aaaaaaa.bbb - 0000006 tag tag_tag 9tag is duplicate of ./Aaaaaaa.bbb - 0000006 tag tag_tag 9tag
./Aaaaaaa.bbb - 0000007 tag tag_tag 9tag is duplicate of ./Aaaaaaa.bbb - 0000007 tag tag_tag 9tag
./Aaaaaaa.bbb - 0000008 tag tag_tag 9tag is duplicate of ./Aaaaaaa.bbb - 0000008 tag tag_tag 9tag
./Aaaaaaa.bbb - 0000009 tag tag_tag 9tag is duplicate of ./Aaaaaaa.bbb - 0000009 tag tag_tag 9tag
./Aaaaaaa.bbb - 0000010 tag tag_tag 9tag is duplicate of ./Aaaaaaa.bbb - 0000010 tag tag_tag 9tag