Поиск по сайту:

3 способа удалить все файлы в каталоге, кроме одного или нескольких файлов с расширениями


Иногда вы попадаете в ситуацию, когда вам необходимо удалить все файлы в каталоге или просто очистить каталог, удалив все файлы, кроме файлов заданного типа (заканчивающихся определенным расширением).

В этой статье мы покажем вам, как удалить файлы в каталоге, за исключением файлов определенных расширений или типов, с помощью команд rm, find и globignore.

Прежде чем двигаться дальше, давайте начнем с краткого рассмотрения одной важной концепции Linux — сопоставления шаблонов имен файлов, которая позволит нам решить нашу проблему.

Рекомендуется к прочтению: Используйте команду find для поиска по нескольким именам файлов/расширениям в Linux

В Linux шаблон оболочки представляет собой строку, состоящую из следующих специальных символов, которые называются подстановочными знаками или метасимволами:

  1. * – соответствует нулю или более символам
  2. ? – соответствует любому отдельному символу
  3. [seq] – соответствует любому символу в последовательности.
  4. [!seq] – соответствует любому символу, не указанному в последовательности.

Здесь мы рассмотрим три возможных метода, в том числе:

Удаление файлов с помощью расширенных операторов сопоставления с образцом

Ниже перечислены различные операторы расширенного сопоставления шаблонов, где pattern-list — это список, содержащий одно или несколько имен файлов, разделенных символом |:

  1. *(список-шаблонов) – соответствует нулю или более вхождению указанных шаблонов.
  2. ?(pattern-list) – соответствует нулю или одному вхождению указанных шаблонов.
  3. +(список-шаблонов) – соответствует одному или нескольким вхождениям указанных шаблонов.
  4. @(pattern-list) – соответствует одному из указанных шаблонов.
  5. !(pattern-list) – соответствует всему, кроме одного из заданных шаблонов.

Чтобы использовать их, включите параметр оболочки extglob следующим образом:

shopt -s extglob

1. Чтобы удалить все файлы в каталоге, кроме имени файла, введите следующую команду:

rm -v !("filename")

2. Чтобы удалить все файлы, за исключением имя_файла1 и имя_файла2:

rm -v !("filename1"|"filename2") 

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

rm -i !(*.zip)

4. Далее вы можете удалить все файлы в каталоге, кроме всех файлов .zip и .odt, как показано ниже, отображая при этом то, что происходит. сделанный:

rm -v !(*.zip|*.odt)

Получив все необходимые команды, отключите параметр оболочки extglob следующим образом:

shopt -u extglob

Удаление файлов с помощью команды find в Linux

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

find /directory/ -type f -not -name 'PATTERN' -delete
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}

5. Следующая команда удалит все файлы, кроме файлов .gz, в текущем каталоге:

find . -type f -not -name '*.gz'-delete

6. Используя конвейер и xargs, вы можете изменить приведенный выше регистр следующим образом:

find . -type f -not -name '*gz' -print0 | xargs -0  -I {} rm -v {}

7. Давайте рассмотрим еще один пример: команда ниже уничтожит все файлы, кроме .gz, .odt и . .jpg файлы в текущем каталоге:

find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete

Удаление файлов с использованием переменной Bash GLOBIGNORE

Однако последний подход работает только с bash. Здесь переменная GLOBIGNORE хранит список шаблонов (имен файлов), разделенных двоеточиями, которые будут игнорироваться при расширении пути.

Рекомендуется к прочтению: 12 полезных практических примеров использования команды Grep в Linux

Чтобы использовать этот метод, перейдите в каталог, который вы хотите очистить, затем установите переменную GLOBIGNORE следующим образом:

cd test
GLOBIGNORE=*.odt:*.iso:*.txt

В этом случае все файлы, кроме файлов .odt, .iso и .txt, будут удалены из текущего каталога.

Теперь запустите команду для очистки каталога:

rm -v *

После этого отключите переменную GLOBIGNORE:

unset GLOBIGNORE

Примечание. Чтобы понять значение флагов, используемых в приведенных выше командах, обратитесь к страницам руководства каждой команды, которые мы использовали на различных иллюстрациях.

Вот и все! Если у вас есть какие-либо другие методы командной строки для той же цели, не забудьте поделиться с нами через раздел отзывов ниже.