Відповіді:
Ви можете використовувати 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.