При запуске ' rm-rf` можно ли исключить некоторые подкаталоги?

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

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

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

пример:

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

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

5
задан warren
источник

4 ответов

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

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

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

1
отвечен Janne Pikkarainen 2010-09-28 13:16:18
источник

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

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)

то же самое в zsh:

setopt ksh_glob
rm -rf !(var_opt|var_log)

ЗШ тоже есть своя расширенная Глобс:

setopt extended_glob
rm -rf ^var_(opt|log)
11
отвечен Gilles 2010-09-28 23:10:56
источник

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

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

GNU Parallel не имеет этой проблемы.

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

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

2
отвечен Ole Tange 2016-04-27 16:35:58
источник

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

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

1
отвечен Toby Speight 2016-04-27 16:47:29
источник

Другие вопросы bash disk-cleanup exclude mount recursion