2013-01-08 12:17:05 +0000 2013-01-08 12:17:05 +0000
123
123

Как удалить все файлы в каталоге, кроме некоторых?

Мне нужно удалить все файлы в каталоге, но исключить некоторые из них. Например, в директории с файлами a b c ... z мне нужно удалить все, кроме u и p. Есть ли простой способ сделать это?

Ответы (17)

144
144
144
2013-01-08 12:34:49 +0000

Для rm все, кроме u,p в бэш просто напечатайте:

rm !(u|p)

Это требует установки следующей опции:

shopt -s extglob

См. подробнее: глоб - Вики Грега

108
108
108
2013-01-08 12:18:23 +0000

В этих случаях я набираю

rm *

Тогда я нажимаю Ctrl+X,* до expand * во все видимые имена файлов.

Затем я могу просто удалить два файла, которые мне нравятся, из списка и, наконец, выполнить командную строку.

71
71
71
2013-01-08 12:35:05 +0000

Вы можете использовать find

find . ! -name u ! -name p -maxdepth 1 -type f -delete
  • ! отрицает следующее выражение
  • -name указывает имя файла
  • -maxdepth 1 сделает процесс поиска только указанным каталогом (find по умолчанию обходит каталоги)
  • -type f будет обрабатывать только файлы (а не, например, каталоги)
  • - -delete удалит файлы

Затем вы можете настроить условия, глядя на man page of find

Обновление

  • Имейте в виду, что порядок элементов выражений значителен (см. документацию)
  • Сначала протестируйте команду, используя -print вместо -delete.
43
43
43
2013-01-08 12:22:58 +0000

Просто:

mv файлы в верхнем каталоге, rm каталог, а затем mv их обратно.

15
15
15
2013-01-08 14:22:21 +0000

Немного похоже на этот ответ , но никаких специальных опций не требуется, насколько я знаю, следующая “старинная” функциональность поддерживается любой (смутно) /bin/sh похожей на оболочку (например, bash, zsh, ksh, и т.д.)

rm [^up]
11
11
11
2013-01-09 03:54:14 +0000

Делаю это, не найдя:

ls | grep -v '(u|p)' | xargs rm

(Правка: “u” и “v”, как и в других местах здесь, используются как общие версии целых регексов. Очевидно, что вы захотите аккуратно закрепить свои регексы, чтобы избежать совпадения слишком многих вещей).

Вы определенно захотите сценарий, если вы собираетесь делать большую часть этого, как другие предлагали.

6
6
6
2013-01-09 22:34:13 +0000

В zsh:

setopt extended_glob # probably in your .zshrc

затем

или

rm ^(u|p)

Второй будет работать, даже если у вас есть ^ в $histchars для замены истории, и, конечно, вы можете поставить произвольный глобус перед ~.

5
5
5
2013-01-08 16:32:06 +0000

GLOBIGNORE берет разделенный двоеточием список

GLOBIGNORE=u:p
rm *
3
3
3
2013-01-08 17:58:46 +0000
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;

Удаляются все файлы, кроме u и p в unix.

3
3
3
2013-01-08 17:02:15 +0000

В эпоху дискет у меня был исполняемый модуль под названием “Except”, который временно перемещал вещи из текущего каталога и выполнял команду, так что можно было сказать:

except \*.txt del \*.\*

, чтобы удалить все, кроме ваших текстовых файлов.

Это было бы довольно тривиальной вещью для реализации в качестве скрипта оболочки, и если это та вещь, которую вы, скорее всего, сделаете более двух раз, то, похоже, это будет хорошей идеей.

2
2
2
2013-01-08 18:16:45 +0000

Для тех, кто предпочитает указывать произвольные сложные шаблоны исключения (охватывающие все затронутые имена файлов) в полноценном стиле регенерации emacs, posix-awk или posix-extended (см. поиск в man-странице), я бы порекомендовал этот шаблон. В этом примере он исключает u и p в текущем dir. Это может быть удобно для скриптов.

find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
1
1
1
2014-09-24 03:05:26 +0000

Еще один:

for FILE in ./*; do if [[$FILE != ./u*]] || [[$FILE != ./p*]];then rm $FILE; fi; done;

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

И это чистое баш-блаженство.

1
1
1
2014-10-22 12:37:57 +0000

Вот другой вариант. Ты можешь печатать:

rm -i *

или:

rm --interactive *

Так что rm попросит вас подтвердить удаление каждого файла.

1
1
1
2016-09-11 02:33:03 +0000

Используйте:

find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete

для удаления всех файлов, включая каталоги, за исключением файлов u, p и .ext.

1
1
1
2013-01-09 20:54:59 +0000

Я всегда пользуюсь:

rm [a-o,q-t,v-z]*

Это позволит вам определить, насколько гранулированным вы хотите его сделать. Таким образом, если вы хотите удалить файлы форматов a-level o и Z, вы можете использовать их:

rm [a-o,z]*
1
1
1
2013-04-01 12:44:13 +0000

Еще одна версия, использующая xargs:

ls -1 | grep -v do_not_delete | xargs -I files rm "files"

Обратите внимание, что xargs -I необходимо для корректной работы с именами файлов, включая пробелы.

0
0
0
2013-10-22 07:06:44 +0000

Простой способ, который трудно испортить: допустим, вы хотите удалить все, кроме *.pdf:

mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp

Похожие вопросы

6
10
11
5
6