Hmmph. Я только что разработал однострочную строку для списка всех дубликатов, для
вопроса, который оказался дубликатом этого. Как мета. Ну,
жаль тратить его впустую, так что я опубликую его, хотя rdfind
звучит как лучшее
решение.
Это, по крайней мере, имеет то преимущество, что это "настоящий" Unix способ сделать это ;)
find -name '*.mp3' -print0 | xargs -0 md5sum | sort | uniq -Dw 32
Разбираем конвейер:
find -name '*.mp3' -print0
находит все mp3 файлы в поддереве, начинающемся
с текущего каталога, и печатает имена с разделителем NUL.
xargs -0 md5sum
читает список, разделенный NUL, и вычисляет контрольную сумму
для каждого файла.
Вы знаете, что делает sort
.
uniq -Dw 32
сравнивает первые 32 символа отсортированных строк и
печатает только те, которые имеют одинаковый хэш.
В итоге вы получаете список всех дубликатов. Затем вы можете сократить его
вручную до тех, которые вы хотите удалить, удалить хэши и
передать список в rm
.
Попробуйте:
cd /opt &&
find. \( \
-path./etc/config -o \
-path./etc/nginx -o \
-path./home -o \
-path./usr/sbin -o \
-path./var/mlocate \) -prune -o \( \
-type d -print0 -o -exec rm -f {} + \) |
tr '\0\n' '\n\0' |
tac |
tr '\0\n' '\n\0' |
xargs -r0 rmdir
-prune
гарантирует, что мы даже не войдем в эти пропущенные каталоги.
Мы удаляем файлы не из каталога -в других каталогах. И оставьте каталоги для обработки после того, как(tac
ничего не выведет, пока find
не завершится, потому что он начинается с последней строки ).
Нам нужно передать список каталогов в обратном порядке rmdir
, так как нам нужно удалить содержимое перед самим каталогом. Обратите внимание, что rmdir
не удалит не -пустые каталоги.
Обычно используется -depth
для обработки листьев перед ветвями, которые их содержат, но мы не можем использовать -depth
с -prune
. По той же причине мы не можем использовать -delete
так, как это подразумевает -depth
.
Согласно ответу jlliagre на find -exec rm vs -delete\;
лучше заменить на +
для оптимизации предложения exec
, не запуская команду rm
для каждого и каждое совпадение, присутствующее в файловой системе.
Требуется дополнительный ! -path "./"
, чтобы не генерировать rm: can't remove '.' or '..'
.