Fdupes, rdfind и убиение дублей файлов
Создано раньше, тока дошли руки вынуть из латехового.
Проблема поиска одинаковых файлов на диске знакома многим. Одним из очевидных решений является использование консольных программ fdupes и/или rdfind.
Если обшаривать не особенно обширные пространства, можно запустить fdupes с ключиком -d, и на каждую группу файлов она будет спрашивать, какие оставить. Заметим, варианта «удали всё нафиг, и чтоб глаза мои не видели!» не предусмотрено. Один экземпляр останется, придётся удалять ручками. Если пространства обширные и дублей много - разгребание в таком режиме просто неподъёмно.
Можно попросить fdupes сложить все обретённые сведения в файлик, например, fdupes -r ./ > duplicates.txt
- прошариваем всё, что в текущем каталоге и подкаталогах. Тогда с этим файликом надо будет как-то разбираться. И опять возникает потрясающая идея удалять всё ручками. Брр!
А ещё, когда разгребаешь от дублей большие объёмы, практически гарантированно возникают пустые папки, папки пустых папок, папки папок пустых папок, и опять же, разгребать всё это безобразие лучше бы не вручную.
Вопросы задали, переходим к ответам.
Ответ номер один - команда, которая может удалять файлы по выданному ей списку. Собирать из xargs и rm, опции по вкусу :)
Смысл xargs тут в том, чтобы передать аргументы команде. Xargs, в отличие от rm и rmdir, соглашается брать инфу и из файла, и из standart input, и умеет собрать команду с этой инфой. И это круто! :)
У меня
xargs --arg-file="2del.txt" --delimiter="\n" -I{} --max-args=1 --interactive --no-run-if-empty --verbose --max-procs=1 rm '{}'
Берём инфу из файла с говорящим названием «удалить», разделитель элементов — новая строка, заменять на элементы из файла будем «{}», удаляем поштучно, спрашиваем разрешения, ничего не делаем с пустой или пробельной строкой, работаем в один процесс.
Это самый осторожный вариант. Реально лучше убрать --interactive
, и запускать rm
с опцией -f
.
cat 2del.txt | grep -v "slovari/stardict/en/" | xargs --delimiter="\n" -I{} --max-args=1 --no-run-if-empty --verbose --max-procs=1 rm '{}'
Примерно то же, но в 2del.txt находится куча имен файлов, из которых (файлов) некоторые (см. что грепаем) удалять не надо. А сортировать вручную - вломмм, и идейно неправильно, ибо пусть работу компа делает комп.
Что приятно - grep без -v будет отдавать дальше то, что совпадает с шаблоном. С -v - то, что не совпадает. Как удобнее в конкретном случае, так и делаем. )
Ответ номер два - команда, которая может находить пустые папки: find где_искать -type d -empty
. Если всё можно нафиг, то find где_искать -type d -empty -delete
.
Если нет, то выводим результат работы find в файл, и собираем команду, которая может удалять пустые папки точно так же, по списку. Почти аналогично первому, но rmdir.
Подробнее про find.
Как у меня это работает.
- Сначала, разумеется,
fdupes -r интересующие_папки > duplicates.txt
. На выходе получаем файлик, в котором по группам собраны одинаковые файлы. - Открыть duplicates.txt, и ``творить''. :) На выходе должен получиться список файлов на удаление и поуменьшившийся duplicates.txt. Иногда копировала часть из dupes.txt и удаляла строки с оставляемым, иногда грепала по адресу каталога, иногда ещё что-то, в общем, как было удобно :)
- Скормить этот список своей любовно собранной команде по мотивам ответа 1.
- Пока не надоело или пока dupes.txt не опустел, повторять шаги 2-3.
- Запустить поиск пустых каталогов командой из ответа 2. Посмотреть, что получилось. Удалить ненужные. Повторять, пока ненужные пустые каталоги не кончатся.
- Забыть всё это как страшный сон до следующего раза :)
rdfind - только собираюсь описать. Её великий плюс - умение ставить хардлинки на идентичные файлы.
^.*/home -> /home
- замена, которую делаю в emacs в файле 2del, упомянутом выше, если собираю из results.txt rdfind-а.
А ещё, по слухам, можно поставить FSlint и что-то из этого сделать, тыцкая на кнопочки. На любителя.
Jdupes - вроде бы замена и fdupes, и rdfind.
Ещё одна замена — backdown.