2015-03-31 6 views
0

Hy,Баш удаления дубликатов файлов на основе номера последовательности в конце

Я пытаюсь удалить некоторые дубликаты файлов в папке (приблиз. 50000 файлов), которые имеют такое же имя, но единственное, что отличающуюся является порядковый номер в конце:

aaaaaaaaaa.ext.84837384 
aaaaaaaaaa.ext.44549388 
aaaaaaaaaa.ext.22134455 
bbbbbbbbbb.ext.11244355 
bbbbbbbbbb.ext.88392456 

Я хочу удалить дубликаты файлов на основе минимального числа последовательностей (.22134455 быть справедливы для aaaaaaaaaa.ext и 0,11244355 быть справедливы для bbbbbbbbbbb)

Я упомянул, что у меня много файлов в папке ~ 50.000 fi les и сортировка и фильтрация на основе размера и md5 будут восприниматься как навсегда.

Я пробовал find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate, но берет навсегда.

Большое спасибо

+0

Почему вы фильтруете базу данных по размеру? –

+0

Итак, вы запускаете 'find' один раз для каждого файла и задаетесь вопросом, почему это занимает много времени? Прекратите выполнение 'find' внутри' xargs' !! –

ответ

2

Используйте этот

find . -name '*.ext.*' -print0 | sort -z | awk -v RS='\0' -F. '{fn=$0; num=$NF; $NF=""; if(a[$0]){printf "%s\0", fn};a[$0]++;}' | xargs -n 100 -0 rm -f 

Объяснение:

  1. find . -name '*.ext.*' -print0: Печать имена файлов с разделителями пустым символом.
  2. sort -z: Отсортировать записи с нулевым разделителем.
  3. awk: отдельные записи пустым символом & по .. удалить последнее поле - номер & запомнить оставшееся имя файла. За исключением первой записи, напечатайте другие имена файлов, разделенные нулевым символом.
  4. xargs -0: получать нулевые символы, разделенные символами на stdin & rm -f.

Успение: все файлы находятся в текущем каталоге.

Добавить -maxdepth 1 возможность найти команду, если есть подкаталоги &, вы хотите пропустить итерацию через них.

+0

'* .ext. *' Скорее всего, не удастся. Используйте 'find ... -name = '*. Ext. *'' (Или даже просто 'ls' и фильтр внутри' awk') –

+0

Если они находятся в подкаталогах, нам нужно найти. Если они находятся в текущем каталоге, 'printf '% s \ 0' * .ext. *' Должен работать, правильно? Или я пропущу что-то очевидное? – anishsane

+0

Если в каталоге много файлов, расширение glob может завершиться неудачно. (Хотя, по-видимому, эта неудача - старая ошибка, которая не проявляется в современных оболочках.) –

1

Этот скрипт удалит все дубликаты файлов в директории, которая находится в.

Список и сортировать файлы по имени файла, порядковый номер будет использоваться для сортировки дубликатов, а затем удалить файл, если он был уже «посетил», еще просто сохранили имя файла минус-последовательности во временной переменной.

#!/bin/bash 

tmp_filename= 

for full_filename in `ls | sort`; do 
    filename=$(basename "$full_filename") 
    extension="${filename##*.}" 
    filename="${filename%.*}" 

    if [[ "$tmp_filename" == "$filename" ]]; then 
     rm "$full_filename" 
    else 
     tmp_filename="$filename" 
    fi 
done 
+0

вы скрипт фактически работайте. Большое спасибо . другой ответ тоже работает, но у меня нет инструмента GNU awk, поэтому ваш ответ подходит для моей проблемы. Большое спасибо – 123onetwothree

Смежные вопросы