Привет, есть ли отдельная кроссплатформенная тулза для удаления файлов (Linux, macOs, freebsd), поддерживающая --exclude '*dir1/dir*/file
(и желательно еще и списки в отдельном файле)? И желательно еще и эффективная.
Задрался с тем, что find
везде разный со своими особенностями (print0? не, не слышали), да еще и на тестовых данных работает, а в реале нет (prune не работает с delete, а для тестов использовался print)
Не хочется писать 100500 реальных тестов для такой, казалось бы обычной, функциональности, которой нет нигде из коробки. Но в случае самостийного скрипта под тройку платформ - без тестов не обойтись, дело то ответственное - удаление.
Upd.
Как вам?
EMPTY=$(mktemp -d empty.XXXXXX --tmpdir)
rsync -r --delete --force --exclude 'other/needed/dir' --exclude '*by/mask.txt' ${EMPTY}/ garbage_dir
rmdir ${EMPTY}
Плюсы решения: rsync впитан всеми с молоком матери и является системнонезависимой программой, с четкоопределенными синтаксисом exclude и src списков. Мощь оптимизации - пробег по ФС с наилучшей эффективностью (--delete
== --delete-during
). Локаничность.
Осталось понять, откуда брать Пока используется empty/
, что-нибудь типа /dev/null
но для пустой директории, что бы не быть завязанным на это имя empty/.mktemp -d
Upd2.
Поржал с того, что а) в FHS не описана какая-нибудь абстрактная empty-dir (по аналогии с пустым файлом /dev/null) б) такой каталог есть по факту /var/empty
(в некоторых дистрах /run/empty
) в) он оккупирован sshd
facepalm
Upd3.
Тулза для удаления файлов с --exclude (типа rsync для копирования) (комментарий)
Заменил геморрой с exclude на перемещение исключений в служебную зону + обычный rm -rf