Ответы:
Вы можете использовать find:
find . -type f ! -name '*.txt' -delete
Или расширенные возможности bash:
shopt -s extglob
rm *.!(txt)
Или в зш:
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 может не иметь -r, вы должны проверить свой локальныйman xargs
Если вы просто хотите удалить все файлы, кроме «* .txt», вы можете использовать следующую команду:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
но если вы также хотите удалить каталоги вместе с файлами, вы можете использовать это:
$ find . ! -name "*.txt" -exec rm -r {} \;
Вы можете использовать перевернутый grep и 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: вы могли заметить двойную обратную косую черту. Один для регулярных выражений, другой для bash, чтобы избежать косой черты.
Просто сделайте:
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.