Мне нужно удалить все файлы в каталоге, но исключить некоторые из них. Например, в каталоге с файлами a b c ... z
мне нужно удалить все, кроме u
и p
. Есть простой способ сделать это?
Мне нужно удалить все файлы в каталоге, но исключить некоторые из них. Например, в каталоге с файлами a b c ... z
мне нужно удалить все, кроме u
и p
. Есть простой способ сделать это?
Ответы:
Что я делаю в этих случаях, чтобы набрать
rm *
Затем я нажимаю Ctrl+ X, *чтобы развернуть *
все видимые имена файлов.
Затем я могу просто удалить два файла, которые я хочу сохранить из списка, и, наконец, выполнить командную строку.
*
расширяется, не становится слишком длинным. : -}
Ctrl
+ Shift
+ x
+*
Для rm
всех, кроме u,p
Bash просто введите:
rm !(u|p)
Для этого необходимо установить следующую опцию:
shopt -s extglob
Смотрите больше: glob - Greg's Wiki
shopt -s extglob
, @Ashot. Кроме того, это просто файлы, а не каталоги, поэтому я удалил -rf
опции в вашей команде.
rm !(index).html
. Это удалит все файлы, оканчивающиеся на «.html», за исключением «index.html».
Ты можешь использовать find
find . ! -name u ! -name p -maxdepth 1 -type f -delete
!
отменяет следующее выражение-name
указывает имя файла-maxdepth 1
заставит процесс поиска только указанную директорию ( find
по умолчанию проходит каталоги)-type f
будет обрабатывать только файлы (а не, например, каталоги)-delete
удалит файлыЗатем вы можете настроить условия, просмотрев справочную страницу поиска.
Обновить
Сначала проверьте свою команду, используя -print
вместо-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print
-delete
сразу после .
этого будет катастрофа (удалит все файлы в CWD)
find . -maxdepth 1 -type f -name '[^up]' -delete
find
мой лучший друг, особенно когда слишком много файлов, чтобы их потерять
Просто:
mv
файлы, которые вы хотите в верхнем каталоге, rm
каталог, а затем mv
их обратно.
rm
без -r
не удалит подкаталоги.
В некоторой степени похож на этот ответ, но никаких специальных опций не требуется, насколько я знаю, что «древняя» функциональность поддерживается любой (смутно) / bin / sh, похожей на оболочку (например, bash, zsh, ksh и т. Д.)
rm [^up]
rm [^up]*
? Я делаю подобные вещи довольно часто.
Делаем это без поиска:
ls | grep -v '(u|p)' | xargs rm
(Отредактируйте: «u» и «v», как и в других местах здесь, используются в качестве универсальных версий целых регулярных выражений. Очевидно, что вам нужно быть осторожным, чтобы привязать свои регулярные выражения, чтобы избежать совпадения слишком многих вещей.)
Вы определенно будете хотеть сценарий, если вы собираетесь делать большую часть этого, как предлагали другие.
-E
либоegrep
u
илиp
grep -L (u|p)' * | xargs rm
где -L
означает список имен файлов, не содержащих совпадения.
u
или p
не любой файл, содержащий u
или p
. Это правильно. Вы можете исправить с помощьюegrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
Еще в эпоху дискет у меня был исполняемый файл dos под названием «Кроме», который временно перемещал вещи из текущего каталога и выполнял команду, так что вы могли бы сказать:
кроме * .txt del *. *
удалить все, кроме ваших текстовых файлов.
Это было бы довольно тривиально реализовать в виде сценария оболочки, и если вы будете делать это более двух раз, кажется, что это хорошая идея.
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
Это удалит все файлы, кроме U и P в Unix
Для тех, кто предпочитает указывать произвольные сложные шаблоны исключений (охватывающие все затронутые имена файлов) в полном стиле remaxp emacs, posix-awk или posix-extended (см. Страницу поиска man), я бы порекомендовал этот. Это исключает u
и p
в текущем dir в этом примере. Это может быть удобно для сценариев.
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextype
будет работать только на версиях GNU
find
расширения find
команды GNU . То же самое относится и к -regextype
варианту. Кроме того, ваша команда также удалит файлы в подкаталогах, тогда как оригинальный вопрос четко задан относительно файлов в каталоге.
Еще один:
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