Как удалить все файлы в каталоге, кроме некоторых?
Мне нужно удалить все файлы в каталоге, но исключить некоторые из них. Например, в директории с файлами a b c ... z
мне нужно удалить все, кроме u
и p
. Есть ли простой способ сделать это?
Мне нужно удалить все файлы в каталоге, но исключить некоторые из них. Например, в директории с файлами a b c ... z
мне нужно удалить все, кроме u
и p
. Есть ли простой способ сделать это?
Для rm
все, кроме u,p
в бэш просто напечатайте:
rm !(u|p)
Это требует установки следующей опции:
shopt -s extglob
См. подробнее: глоб - Вики Грега
В этих случаях я набираю
rm *
Тогда я нажимаю Ctrl+X,* до expand *
во все видимые имена файлов.
Затем я могу просто удалить два файла, которые мне нравятся, из списка и, наконец, выполнить командную строку.
Вы можете использовать find
find . ! -name u ! -name p -maxdepth 1 -type f -delete
!
отрицает следующее выражение -name
указывает имя файла -maxdepth 1
сделает процесс поиска только указанным каталогом (find
по умолчанию обходит каталоги) -type f
будет обрабатывать только файлы (а не, например, каталоги) -delete
удалит файлы Затем вы можете настроить условия, глядя на man page of find
Обновление
-print
вместо -delete
.Просто:
mv
файлы в верхнем каталоге, rm
каталог, а затем mv
их обратно.
Немного похоже на этот ответ , но никаких специальных опций не требуется, насколько я знаю, следующая “старинная” функциональность поддерживается любой (смутно) /bin/sh похожей на оболочку (например, bash, zsh, ksh, и т.д.)
rm [^up]
Делаю это, не найдя:
ls | grep -v '(u|p)' | xargs rm
(Правка: “u” и “v”, как и в других местах здесь, используются как общие версии целых регексов. Очевидно, что вы захотите аккуратно закрепить свои регексы, чтобы избежать совпадения слишком многих вещей).
Вы определенно захотите сценарий, если вы собираетесь делать большую часть этого, как другие предлагали.
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
Удаляются все файлы, кроме u и p в unix.
В эпоху дискет у меня был исполняемый модуль под названием “Except”, который временно перемещал вещи из текущего каталога и выполнял команду, так что можно было сказать:
except \*.txt del \*.\*
, чтобы удалить все, кроме ваших текстовых файлов.
Это было бы довольно тривиальной вещью для реализации в качестве скрипта оболочки, и если это та вещь, которую вы, скорее всего, сделаете более двух раз, то, похоже, это будет хорошей идеей.
Для тех, кто предпочитает указывать произвольные сложные шаблоны исключения (охватывающие все затронутые имена файлов) в полноценном стиле регенерации emacs, posix-awk или posix-extended (см. поиск в man-странице), я бы порекомендовал этот шаблон. В этом примере он исключает u
и p
в текущем dir. Это может быть удобно для скриптов.
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
Еще один:
for FILE in ./*; do if [[$FILE != ./u*]] || [[$FILE != ./p*]];then rm $FILE; fi; done;
Это немного длинно, и я не знаю, сможешь ли ты легко превратить это в функцию, которая может легко вместить и произвольное количество аргументов, но она хорошо работает.
И это чистое баш-блаженство.
Вот другой вариант. Ты можешь печатать:
rm -i *
или:
rm --interactive *
Так что rm
попросит вас подтвердить удаление каждого файла.
Используйте:
find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
для удаления всех файлов, включая каталоги, за исключением файлов u, p и .ext.
Простой способ, который трудно испортить: допустим, вы хотите удалить все, кроме *.pdf:
mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp