Найти дубликаты по filemane
У меня есть около 167 тыс. Файлов в одной папке (на данный момент) и переименована с помощью этого скрипта здесь: переименование группы файлов, но только часть заголовка.
Как я могу найти дубликаты файлов по их именам (только цифры в этом конкретном месте) и удалить самый старый файл: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