Можно использовать find
:
find . -type f ! -name '*.txt' -delete
Или удар расширил globbing функции:
shopt -s extglob
rm *.!(txt)
Или в zsh:
setopt extendedglob
rm *~*.txt(.)
# || ^^^ Only plain files
# ||^^^^^ files ending in ".txt"
# | \Except
# \Everything
Если Вы просто хотите удалить все файлы кроме '*.txt', затем можно использовать следующую команду:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
но если Вы также хотите удалить каталоги наряду с файлами затем, можно использовать это:
$ find . ! -name "*.txt" -exec rm -r {} \;
существует много путей, мог сделать это. но самый простой путь был бы, (колотите):
shopt -s extglob
rm !(*.txt)
Одно решение без find
:
mv dir/*.txt otherdir/
rm -r dir
mv otherdir dir
Это должно работать над всем видом оболочек.
Можно использовать инвертированный grep и xargs
ls | grep -v .txt$| xargs rm
grep -v *.txt
будет работать, только если существует точно один .txt
файл. Если нет ни одного, grep
будет использовать *.txt
как шаблон; если будет больше чем один, то это будет искать первое имя файла во всем другом .txt
файлы, игнорируя вывод от ls
. (Точные результаты могут зависеть от опций шарика оболочки.) спасибо
– JigglyNaga
21.07.2016, 19:11
Просто сделайте:
rm $(ls -I "*.txt" )
#Удаляет тип файла кроме *.txt
Аналогично, если нужно удалить "кроме одного или нескольких типов файлов", сделайте:
rm $(ls -I "*.txt" -I "*. pdf" )
#Удаляет типы файлов, кроме *.txt и *.pdf
Это работает также для удаления всех скрытых (точечных)файлов и папок, кроме указанного(.mydir
):
rm -rf $(ls -aI ".mydir")
*.!(txt)
быть!(*.txt)
? – Lri 06.06.2013, 11:32rm
дросселировал бы, если бы были папки. – Kevin 06.06.2013, 16:22