Мне нужно удалить все файлы в каталоге, но исключить некоторые из них. Например, в каталоге с файлами a b c ... zмне нужно удалить все, кроме uи p. Есть простой способ сделать это?
Мне нужно удалить все файлы в каталоге, но исключить некоторые из них. Например, в каталоге с файлами a b c ... zмне нужно удалить все, кроме uи p. Есть простой способ сделать это?
Ответы:
Что я делаю в этих случаях, чтобы набрать
rm *
Затем я нажимаю Ctrl+ X, *чтобы развернуть * все видимые имена файлов.
Затем я могу просто удалить два файла, которые я хочу сохранить из списка, и, наконец, выполнить командную строку.
*расширяется, не становится слишком длинным. : -}
Ctrl+ Shift+ x+*
Для rmвсех, кроме u,pBash просто введите:
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