LINUX.ORG.RU
решено ФорумAdmin

Тулза для удаления файлов с --exclude (типа rsync для копирования)

 , , ,


1

3

Привет, есть ли отдельная кроссплатформенная тулза для удаления файлов (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

Deleted

Последнее исправление: Deleted (всего исправлений: 10)

есть ли отдельная кроссплатформенная тулза для удаления файлов (и желательно еще и списки в отдельном файле)?

Если есть текстовые списки файлов, то:

Списки в bash

Там есть подводные камни.

Deleted
()

Предлагаю обсудить решение

rsync -a --exclude '*test/dont_del.txt' empty/ test_copy04 --delete --force

empty/, как можно подумать, просто пустой каталог после mkdir

Deleted
()
Ответ на: комментарий от Deleted

цель - без тестов, без примеров. Что бы человек понимал сразу, что команда рабочая. Поэтому - никаких примеров, все должно быть интуитивно, как touch 132 или rm -rf /, ведь операция базовая, и должна применяться как элементраный кирпич в любой сложной автоматизации

Deleted
()
Ответ на: комментарий от Deleted

цель - без тестов, без примеров.

А, глобальный «рецепт». Ну здесь нужны спецы, знающие все подводные камни. Я пас.

Deleted
()
Ответ на: комментарий от Deleted

Я пас.

вот и я о том. Никакие разумные тесты однострочника не докажут его корректность (на самом деле, я сомневаюсь, но отталкиваюсь от этого и от лени). Поэтому, расчет на здравый смысл, локаничность однострочника, и мнение ЛОРа

Deleted
()

Я бы тебе рассказал о возможностях `rm`, но ты описаешься от счастья.

anonymous
()
Ответ на: комментарий от anonymous

О, удиви меня. Только чур парсить rm -i не предлагать.

Deleted
()

find везде разный со своими особенностями

По подробнее можно? freebsd под рукой нет, но на macos и linux одинаково.

anc ★★★★★
()
Ответ на: комментарий от anc

Если выделю конкретный кейз, напишу. Топик создал потому, что решение на базе find было жутко хрупким и многословным. Добившись работы его у себя локально, я словил головняк на тестовых нодах со старыми\не-gnu версиями тулов. Честно говоря, для таких фундаментальных задач хотелось бы меньше времени проводить, сравнивая маны на разных системах с разными версиями find/gfind, ища почему какой-нибудь -exec вылетает по signal 13 на одной из систем.

Deleted
()

Вместо -a обойдись простой рекурсией. Зачем тебе шатать права и времена директории?

Ну и exclude из файла у рсинка вполне себе есть

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

Ну и exclude из файла у рсинка вполне себе есть

естественно

Вместо -a обойдись простой рекурсией

точно. На автомате написал

Deleted
()

Как вам?

Ті вібрал наилучшее решение.

В пределах локалхоста рсинк наиболее бістрій для удаления куча файлов. Та и не только для удаления, а вообще для работі с тісячами файлов.

PunkoIvan ★★★★
()
Ответ на: комментарий от legolegs

К сожалению,

skipping non-regular file "null"
Deleted
()
Ответ на: комментарий от Deleted

на базе find было жутко .... многословным.

Согласен.

Честно говоря, для таких фундаментальных задач

Я бы не назвал конкретно Вашу задачу «фундаментальной». Использование regex всегда может обернуться выстрелом в ногу. Зачем же заряжать ружье и направлять его в ногу поциенту? Может быть, если ему все это придется делать самому, на каком-то этапе он подумает «а ну его в попу» и бросит это занятие? Конечно притянуто за уши, но поверьте, в множественных правилах использование not это большое зло. И проблема не в самом not, проблема в том - что «прокладка» не правильно понимает «предполагаемый» результат. Как типичный пример путаницы: не условие A или не условие B vs не условие A и не условие B.

anc ★★★★★
()
Ответ на: комментарий от legolegs

Проверь не прокатит ли /dev/null за пустую директорию?

Скорее /dev прокатит (не, а что, совпадений с dst предполагаемо не будет). Конечно «все есть файл» но не до такой степени. /dev/null все-таки файл.

anc ★★★★★
()
Ответ на: комментарий от anc

Может быть, если ему все это придется делать самому, на каком-то этапе он подумает «а ну его в попу» и бросит это занятие?

Это конечно хорошая защита от дурака, только слишком трудоемко. Можно было бы черкануть где-нибудь (раз уж я маны перечитывал), что опция –exclude опасна для rm по такой-то причине.

Фактически, так и получилось. Вчера уже заменил неудобную конструкцию удаления с фильтром на перемещение нужных подкаталогов и файлов в служебную зону + простой rm изначального каталога. Так наглядней.

Если бы существовал некий отлаженный стандартный rdel --exclude ... я бы использовал его, т.к. он еще более наглядный. Но делать его самому стало не только трудоемко, но и излишне переусложнено - я уже выделил отдельные авто тесты для этой функции и накалякал добрую сотню строк по разбору аргументов. И это реально бред для такой функциональности. Но я считаю она должна была бы быть из коробки.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.