Я хотел бы знать, можно ли и как пропустить определенные каталоги во время операции rm -rf.

Так, например, это место содержит следующие подпапки (не совсем это просто для примера):

foo
bar
elf
qrs

Во время моего сценария, который выполняет rm -rf * в этом каталоге, я хотел бы знать, можно ли (например) пропустить удаление elf.

Обычно я мог бы просто передать каждый каталог команде с rm -rf foo bar qrs, однако мой сценарий таков, поскольку это в сценарии для многих разных систем, каждая система будет иметь разные папки. Например, система 1 может содержать следующее:

foo
bar
elf
qrs

В то время как system2 может содержать следующее:

ubt
dbn
arc
elf
gnt

Я хотел бы, чтобы команда rm -rf была одинаковой для обоих; удаление всего, кроме elf.

Это каким-либо образом возможно?

Заранее спасибо.

1
Daniel M. 7 Июн 2020 в 20:27
Вы можете использовать «find . | grep -v «elf» | xargs rm -rf» в родительском каталоге, в котором вы хотите рекурсивно удалить элементы.
 – 
Parsa Mousavi
7 Июн 2020 в 20:35
Является ли find -type d ! -name "elf" -delete вариантом для вашего случая?
 – 
danielleontiev
7 Июн 2020 в 20:36
Да. Достаточно лаконично и полезно. Не знал этого.
 – 
Parsa Mousavi
7 Июн 2020 в 20:38

2 ответа

Лучший ответ

Согласно этому встроенного исключения нет функциональность на rm. Однако в статье подробно описаны несколько методов с использованием некоторых команд оболочки для достижения того же результата.

Первый вариант кажется вам наиболее подходящим:

Удалите все файлы, кроме файла Important.txt:
rm !(important.txt)

2
SimiliarProblem 7 Июн 2020 в 20:35
Спасибо, это работает на 100%. Я добавил -rf в команду make: rm -rf !(elf), и это работает.
 – 
Daniel M.
7 Июн 2020 в 20:46

Одно из возможных решений:

find -type d ! -name "elf" -delete
1
danielleontiev 7 Июн 2020 в 20:45
1
Спасибо, это тоже работает. Жаль, что это не позволит мне принять 2 ответа. Но я проголосовал за это :)
 – 
Daniel M.
7 Июн 2020 в 20:48