Опция -f для rmdir

Краткая версия:

Я ищу способ получить поведение флага -fв . ] rmпри использовании rmdir.

Полная версия:

Я запускаю параллельный процесс, в котором каждая команда после завершения должна очищать свой рабочий каталог. Команды могут работать в одном и том же рабочем каталоге, поэтому rmdir -p --ignore-fail-on-non-emptyотлично работает, чтобы предотвратить удаление рабочим процессом каталога, который все еще используется другим рабочим процессом. Единственная проблема, по-видимому, возникает, когда два последних рабочих процесса, базирующихся в одном и том же каталоге, завершают работу одновременно — тогда один из рабочих процессов оказывается заблокированным, и rmdirвозвращает ошибку «Нет такого файла или каталога».

Есть ли способ заставить rmdirигнорировать эту проблему, как это делает rmс -f?

(rmимеет параметр -d, который может быть другим решением, но я не вижу способа получить -p --ignore- поведение типа fail-on-non-emptyс rm. В любом случае, -dне является универсальным для всех версий rm, поэтому лучше избегать такого подхода.)

0
23.06.2020, 10:23
1 ответ

Вы можете сначала проверить, существует ли каталог:

[ -d "$tmpdir" ] && rmdir -p --ignore-fail-on-non-empty "$tmpdir" 

Это по-прежнему может вызывать ошибки, если два задания начинают удалять каталог в одно и то же время (a Уязвимость TOCTOU:оба тестируют и видят каталог, а затем оба пытаются его удалить ), но это, вероятно, не слишком вероятно.

Или вы можете просто игнорировать каждую ошибку, которую rmdirможет вызвать:

rmdir -p --ignore-fail-on-non-empty "$tmpdir" 2>/dev/null || true

Или создайте собственную программу, чтобы удалить каталог, но игнорировать только ошибку «Файл не существует». Например. с Перлом:

perl -le 'if (not rmdir($ARGV[0]) and not $!{ENOENT}) { 
       warn "rmdir: $!\n"; exit 1; }' "$tmpdir"
0
18.03.2021, 23:24

Теги

Похожие вопросы