Відповіді:
Ви можете використовувати find
:
find . -type f ! -name '*.txt' -delete
Або розширені можливості глобуса:
shopt -s extglob
rm *.!(txt)
Або в zsh:
setopt extendedglob
rm *~*.txt(.)
# || ^^^ Only plain files
# ||^^^^^ files ending in ".txt"
# | \Except
# \Everything
*.!(txt)
бути !(*.txt)
?
rm
задушиться, якби були папки.
find . -type f ! -name "*.txt" | xargs -r rm
буде працювати в GNU \ xargs. Команди BSD і UNIX xargs можуть не мати -ж вам доведеться перевірити свій місцевийman xargs
Якщо ви просто хочете видалити всі файли, окрім "* .txt", тоді ви можете скористатися такою командою:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
але якщо ви також хочете видалити каталоги разом з файлами, ви можете скористатися цим:
$ find . ! -name "*.txt" -exec rm -r {} \;
Можна використовувати перевернутий греп і xargs
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rm
працює так само добре
grep -v *.txt
працюватиме лише за наявності лише одного .txt
файлу. Якщо цього немає, grep
використовуватимемо *.txt
як шаблон; якщо є більше одного, він буде шукати перше ім'я файлу у всіх інших .txt
файлах, ігноруючи вихід з ls
. (Точні результати можуть залежати від
.txt$
буде відповідати рядкам, що закінчуються txt
незалежно від крапки. Тому що grep
приймає регулярний вираз як параметр. Отже, файли a.txt
і aatxt
і a-txt
всі будуть відповідати цьому виразу. Правильний вираз повинен бути ls | grep -v \\.txt$ | xargs --no-run-if-empty rm
. Для допитливих людей: Якщо ви хочете пограти з виразом, сміливо використовуйте цей тестовий вираз ls | grep \\.txt$ | xargs --no-run-if-empty echo
(зверніть увагу: немає -v
прапора і rm=>echo
). Примітка2: ви, можливо, помітили подвійний нахил. Один призначений для регулярного вираження, інший - для того, щоб уникнути риси.
Просто робіть:
rm $(ls -I "*.txt" )
# Видає тип файлу, крім * .txt
Так само, якщо потрібно видалити "крім одного або декількох типів файлів", зробіть:
rm $(ls -I "*.txt" -I "*.pdf" )
# Видає типи файлів, крім * .txt & * .pdf
-I
Варіант може бути корисний, але бачити , чому не розібрати Ls . І що | xargs
досягає? Без жодних аргументів він просто працює echo
на всіх своїх вкладах.
xargs
слід досягти?
Це також працює для видалення всіх прихованих (крапкових) файлів і папок, крім вказаного ( .mydir
):
rm -rf $(ls -aI ".mydir")
ls
раніше, ніж насправді намагалися зателефонуватиrm
.