4

Я обычно использую bind mounts, чтобы помочь сделать пространство доступным в нескольких местах без необходимости иметь несколько логических томов / физических разделов / LUN и т.д.

Например, у меня может быть 200G LV, установленный в /space . Оттуда я создам подкаталоги, такие как var_opt и var_log которые затем я могу связать с mount /var/opt и /var/log соответственно.

Можно ли при очистке каталога 'space' исключать каталоги из rm -rf работающего внутри /space?

Пример:

# pwd
/space
# rm -rf * {except-for-var_opt-and-var_log}

Есть ли другой или лучший (но такой же простой) способ выполнить то, что я пытаюсь сделать, о котором я не думал?

4 ответа4

11

Простая концептуально и имеет низкий риск ошибки:

mkdir TO_DELETE
mv * TO_DELETE
mv TO_DELETE/var_opt TO_DELETE/var_log .
rm -rf TO_DELETE

Вы также можете использовать расширенные глобусы ksh:

rm -rf !(var_opt|var_log)

Они также доступны в bash, если вы включите их:

shopt -s extglob
rm -rf !(var_opt|var_log)

То же самое в зш:

setopt ksh_glob
rm -rf !(var_opt|var_log)

У Zsh также есть свои собственные расширенные глобусы:

setopt extended_glob
rm -rf ^var_(opt|log)
2

Если ваши имена входных файлов генерируются пользователями, вам нужно иметь дело с неожиданными именами файлов, содержащими пробел, 'или "в имени файла.

Использование xargs может привести к неприятным сюрпризам из-за проблемы с разделителем.

У GNU Parallel такой проблемы нет.

find /space ! -iregex '(var_opt|var_log)' | parallel -X rm -f

Посмотрите вступительное видео для GNU Parallel, чтобы узнать больше.

1

Может быть, с помощью комбинации find + xargs + rm?

find /space ! -iregex '(var_opt|var_log)' | xargs rm -f

или что-то в этой мелодии. Конечно, было бы разумно сначала дать команду xargs выполнить что-то более безвредное, например, echo, прежде чем изменить его на rm ...

1

Если каталоги, которые вы хотите сохранить, являются точками монтирования, вы можете использовать --one-file-system в GNU rm .

Я не исследовал, как это реализовано, но я предполагаю, что это не будет делать то, что вы хотите, если монтирование привязки происходит из одной файловой системы, так что будьте осторожны! rm нет опции --no-act , но вы можете передать yes no | rm -ir . например.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .