Назад | Перейти на главную страницу

Удалить все файлы и каталоги в папке, кроме одного файла

Я хочу удалить все файлы и каталоги в папке, например «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 :)

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