В Linux, как удалить все файлы КРОМЕ шаблона *.txt?

CtrlG это прервет поиск

80
06.06.2013, 00:59
7 ответов

Можно использовать 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
115
27.01.2020, 19:31
  • 1
    Некоторые из них, возможно, должен быть адаптирован в зависимости от того, есть ли у Вас папки и что Вы хотите сделать с ними. –  Kevin 05.06.2013, 18:58
  • 2
    Не был Должен *.!(txt) быть !(*.txt)? –  Lri 06.06.2013, 11:32
  • 3
    @LauriRanta зависит от того, что находится в папке, на которую мы не получили ответ. Это прекрасно, как то, если все файлы имеют расширения, и rm дросселировал бы, если бы были папки. –  Kevin 06.06.2013, 16:22
  • 4
    у меня есть проблема со скобками. Когда я использую стиль globbing в сценарии удара, он жалуется на синтаксическую ошибку и круглые скобки. Однако делая его от работ CLI. –  CMCDragonkai 17.01.2014, 10:56

Если Вы просто хотите удалить все файлы кроме '*.txt', затем можно использовать следующую команду:

$ find . -type f ! -name "*.txt" -exec rm -rf {} \;

но если Вы также хотите удалить каталоги наряду с файлами затем, можно использовать это:

$ find . ! -name "*.txt" -exec rm -r {} \;

12
27.01.2020, 19:31

существует много путей, мог сделать это. но самый простой путь был бы, (колотите):

shopt -s extglob
rm !(*.txt)
10
27.01.2020, 19:31

Одно решение без find:

mv dir/*.txt otherdir/
rm -r dir
mv otherdir dir

Это должно работать над всем видом оболочек.

4
27.01.2020, 19:31

Можно использовать инвертированный grep и xargs

ls | grep -v .txt$| xargs rm
3
27.01.2020, 19:31
  • 1
    ls | grep -v *.txt | xargs rm работы точно также –  phillipsk 27.02.2016, 15:32
  • 2
    @phillipsk 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

2
20.08.2021, 13:11

Это работает также для удаления всех скрытых (точечных)файлов и папок, кроме указанного(.mydir):

rm -rf $(ls -aI ".mydir")
1
20.08.2021, 13:11

Теги

Похожие вопросы