Ответы:
Вы можете использовать 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
.