3 способа удалить все файлы в каталоге, кроме одного или нескольких файлов с расширениями
Иногда вы попадаете в ситуацию, когда вам необходимо удалить все файлы в каталоге или просто очистить каталог, удалив все файлы, кроме файлов заданного типа (заканчивающихся определенным расширением).
В этой статье мы покажем вам, как удалить файлы в каталоге, за исключением файлов определенных расширений или типов, с помощью команд rm, find и globignore.
Прежде чем двигаться дальше, давайте начнем с краткого рассмотрения одной важной концепции Linux — сопоставления шаблонов имен файлов, которая позволит нам решить нашу проблему.
Рекомендуется к прочтению: Используйте команду find для поиска по нескольким именам файлов/расширениям в Linux
В Linux шаблон оболочки представляет собой строку, состоящую из следующих специальных символов, которые называются подстановочными знаками или метасимволами:
*
– соответствует нулю или более символам?
– соответствует любому отдельному символу[seq]
– соответствует любому символу в последовательности.[!seq]
– соответствует любому символу, не указанному в последовательности.
Здесь мы рассмотрим три возможных метода, в том числе:
Удаление файлов с помощью расширенных операторов сопоставления с образцом
Ниже перечислены различные операторы расширенного сопоставления шаблонов, где pattern-list — это список, содержащий одно или несколько имен файлов, разделенных символом |
:
*(список-шаблонов)
– соответствует нулю или более вхождению указанных шаблонов.?(pattern-list)
– соответствует нулю или одному вхождению указанных шаблонов.- +(список-шаблонов) – соответствует одному или нескольким вхождениям указанных шаблонов.
@(pattern-list)
– соответствует одному из указанных шаблонов.!(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
Примечание. Чтобы понять значение флагов, используемых в приведенных выше командах, обратитесь к страницам руководства каждой команды, которые мы использовали на различных иллюстрациях.
Вот и все! Если у вас есть какие-либо другие методы командной строки для той же цели, не забудьте поделиться с нами через раздел отзывов ниже.