Я хочу удалить все файлы и каталоги в папке, например «A». Но кроме одного файла в этой папке, скажем .keep. Я пробовал следующую команду.
найти ! -name '.keep' -type f -exec rm -f {} +
Но приведенная выше команда также удаляет папку A. Я не хочу этого. На этот счет есть несколько ответов. Но все они упоминают вход в этот каталог. Я хочу указать этот каталог в команде, не заходя в него cd-e.
find A ! -path A/.keep -a ! -path A -delete
Короче говоря, вы находите файлы, которые хотите сохранить, и после -o
(сокращение от «или»), который получит все «другие» несовпадающие файлы, вы можете делать все, что вам нужно.
Еще один полезный аргумент: -mindepth 1
, что позволяет легко пропустить верхний уровень (уровень 0).
Вот пример, инициируйте дерево следующим образом:
$ mkdir a a/b; touch a/{c,d,e,keep1} a/b/{f,g,h,keep2}
$ find a/ -exec ls -gGd {} +
drwxr-xr-x 1 18 Jul 12 14:31 a/
drwxr-xr-x 1 16 Jul 12 14:31 a/b
-rw-r--r-- 1 0 Jul 12 14:31 a/b/f
-rw-r--r-- 1 0 Jul 12 14:31 a/b/g
-rw-r--r-- 1 0 Jul 12 14:31 a/b/h
-rw-r--r-- 1 0 Jul 12 14:31 a/b/keep2
-rw-r--r-- 1 0 Jul 12 14:31 a/c
-rw-r--r-- 1 0 Jul 12 14:31 a/d
-rw-r--r-- 1 0 Jul 12 14:31 a/e
-rw-r--r-- 1 0 Jul 12 14:31 a/keep1
Команда для очистки всех файлов, кроме файлов «сохранить», может быть следующей:
$ find a/ -mindepth 1 -name keep1 -o -name keep2 -o \( -not -type d -exec ls -gGd {} + \)
-rw-r--r-- 1 0 Jul 12 14:31 a/b/f
-rw-r--r-- 1 0 Jul 12 14:31 a/b/g
-rw-r--r-- 1 0 Jul 12 14:31 a/b/h
-rw-r--r-- 1 0 Jul 12 14:31 a/c
-rw-r--r-- 1 0 Jul 12 14:31 a/d
-rw-r--r-- 1 0 Jul 12 14:31 a/e
Как вы видете, keep1
и keep2
отсутствуют в списке аргументов, переданных в ls
команда. Не стесняйтесь заменить ls -gGd
с участием rm -vf
:)
Вы можете изменить аргументы в скобках, если у вас есть дополнительные требования.