2016-10-10 2 views
0

У меня есть файловая структура, которая выглядит примерно следующим образом:Как я могу найти и удалить дубликаты и сохранить новейшие?

dir1 
|--subdir1 
    |--file1 (modified date1) 
    |--file2 (modified date2) 
    |--file3 (modified date1) 
|--subdir2 
    |--file4 (modified date3) 
    |--file5 (modified date4) 
    |--file6 (modified date3) 

файлы являются музыкальные файлы с немного другой информации ID3, так fdupes не улавливает их как дублирующие, хотя они есть. Я хотел бы запустить команду из dir1, которая будет перезаписываться в каждом подкаталоге, найти максимальную модифицированную дату для всех файлов и затем вызывать удаление любого файла с модифицированной датой, более старой.

Есть ли способ сделать это в Linux? Ожидаемый результат будет:

dir1 
|--subdir1 
    |--file1 (modified date1) 
    |--file3 (modified date1) 
|--subdir2 
    |--file4 (modified date3) 
    |--file6 (modified date3) 
+0

Если файлы не точные дубликаты, как мы знаем, один является дубликатом другого? Без этой информации ваш «ожидаемый» результат просто неожиданен. – tripleee

+0

Я знаю, что они дубликаты, потому что файлы были первоначально организованы художником и альбомом ID3. Причина в дублировании заключается в том, что я повторно разорвал альбомы, используя немного отличную информацию о треке ID3. У меня нет возможности программно проверять фактические дубликаты, но я неявно знаю, что они есть. – wesanyer

ответ

0

stat -c %Y <file> даст вам время последней модификации файла в секундах, прошедшее с момента Epoch. Для того, чтобы найти «максимальное изменение даты» (который я предполагаю, это последняя модификация):

for i in `ls -1 subdir1/`; do stat -c %Y subdir1/${i} >> mod_dates.txt;done 
latest_mod=`cat mod_dates.txt | sort -nr | head -n 1` 

Для удаления старых файлов:

for i in `ls -1 subdir1/`; do if [[ `stat -c %Y $i` -lt $latest_mod ]]; then rm subdir1/${i};fi;done 
+0

Прежде всего, проверьте, является ли 'sort -n' самым старым или последним по порядку. В любом случае вы можете отменить его с помощью опции -r. – deefff

+0

Действительно, вам нужны обратные результаты 'sort'. Я проверил и обновил свой ответ. Кроме того, если вам нужно сделать это на других поддиректорах, вы можете заключить все это в другой цикл, например: 'for j in \' ls -d */\ '; do <вставить остаток кода здесь>; done' Конечно, вам нужно будет заменить ссылки на 'subdir1' на' $ j'. – deefff

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