🐧 Как удалить файлы с определенным расширением в командной строке Linux

Мануал

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

Это руководство поможет вам сделать именно это.

Вы используете команду rm для удаления файлов и папок следующим образом:

rm [option] filename

Может показаться, что здесь нужно знать точные имена файлов, но это не так.

Позвольте мне показать вам несколько методов удаления нескольких файлов на основе их расширения.

Способ 1: Как удалить файлы по расширению с помощью команды rm

В моем примере у меня есть куча gif-файлов, которые заканчиваются расширением .gif.

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

rm *.gif

Такое удаление файлов вслепую может быть рискованным.

Всегда полезно сначала посмотреть, какие файлы будут удалены с помощью команды ls:

ls *.gif

Вот как я удалю файлы с расширением .gif:

$ ls
1.gif  2.gif  3.gif  4.gif  a.jpg  b.png  c.webp

$ ls *.gif
1.gif  2.gif  3.gif  4.gif


$ rm -v *.gif
removed '1.gif'
removed '2.gif'
removed '3.gif'
removed '4.gif'

$ ls
a.jpg  b.png  c.webp

Это можно сделать для любых расширений файлов, не только .gif.

Можно даже объединить несколько расширений.

$ ls
f1.txt  f2.txt  f3.txt  f4.txt  not-txt-file.pdf random.txt


$ rm -v *.txt *.pdf
removed 'f1.txt'
removed 'f2.txt'
removed 'f3.txt'
removed 'f4.txt'
removed 'not-txt-file.pdf'

$ ls
random.txt

Вы можете использовать интерактивную опцию -i с командой rm, которая запрашивает подтверждение перед удалением каждого файла. Однако это может быть неудобно, если вам нужно удалить множество файлов.

Интересно, как это работает? Подстановочные знаки!

В двух словах, подстановочный знак – это специальный символ, который используется для поиска определенного шаблона.

Ниже приведены несколько часто используемых символов подстановки:

Символ Использование
* Совпадение одного или нескольких результатов
? Сопоставить одно совпадение
[]      (Квадратные скобки) Указать диапазон для сопоставления
^ Исключение

Вы использовали подстановочный знак *, что означает, что он может соответствовать одному или нескольким совпадению любого символа.

Когда вы вводите *.gif, это означает любую комбинацию букв, которая ведет к .gif.

Другими словами, это даст вам все файлы с расширением .gif.

Каждый подстановочный знак может быть использован в дополнение к еще одному подстановочному знаку.

Но не будем сейчас углубляться в эти детали.

Точка между * и расширением очень важна!

Многие люди совершают ошибку, путая *.gif с *gif.

Это неправильно.

Точка (.) между * и именем расширения имеет решающее значение.

Возьмем сценарий со следующими файлами и посмотрим, что произойдет, когда я использую регекс *gif вместо *.gif:

$ ls

1.gif  2.gif  3.gif  4.gif  definately-not-a-gif  jpg-not-gif  not-a-gif


$ rm -v *gif

removed '1.gif'
removed '2.gif'
removed '3.gif'
removed '4.gif'
removed 'definately-not-a-gif'
removed 'jpg-not-gif'
removed 'not-a-gif'

Команда также удалила файлы со строкой gif, хотя это не было расширением файла, а просто gif в конце имени файла без предшествующей точки.

Когда вы удаляете файлы с помощью подстановочных знаков или regex, пожалуйста, убедитесь, что вы максимально точны.

Метод 2: Рекурсивное удаление файлов с определенным расширением с помощью команды find

Команда rm удаляет только файлы в текущем каталоге.

Она не удаляет файлы из подкаталогов, даже с опцией рекурсии.

Чтобы рекурсивно удалить файлы с определенным расширением, можно комбинировать команды find и rm:

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

$ ls *
file_0.gif  file_z.txt  not-a-gif  not-a-txt

dir1:
file_1.gif  file_a.txt  not-a-gif  not-a-txt

dir2:
file_2.gif  file_b.txt  not-a-gif  not-a-txt

dir3:
file_3.gif  file_c.txt  not-a-gif  not-a-txt

dir4:
file_4.gif  file_d.txt  not-a-gif  not-a-txt

Чтобы удалить файлы, вы можете использовать команду find следующим образом:

find . -type f -name "*.gif" -exec rm -v {} \;

Вот вывод, когда я выполнил команду:

$ find . -type f -name "*.gif" -exec rm -v {} \;
removed './dir1/file_1.gif'
removed './dir3/file_3.gif'
removed './dir2/file_2.gif'
removed './file_0.gif'
removed './dir4/file_4.gif

Давайте разберемся.

  • Точка после “find” означает поиск в текущем каталоге.
  • Флаг “-name” указывает имя файла, в котором мы можем использовать regex
  • Флаг “-exec” используется для выполнения команды bash на результат команды find
  • Фигурные скобки “{}” служат для размещения результата поиска файла(ов), поэтому “rm -v {}” удалит файлы, найденные командой find.
  • Наконец, точка с запятой завершает команду, выполняемую оболочкой (команда после exec), и обратная косая черта ‘\’ используется для того, чтобы точка с запятой была поставлена правильно. Вам не следует беспокоиться об этом.

Другие примеры использования команды find вы можете изучить в статье:

👸 Как использовать на Linux команду find для поиска файлов

бонусный совет: Используем команду find для работы с файлами с несколькими расширениями

Приведенная выше команда не позволяет найти файлы с несколькими расширениями, например, “rm *.gif *.txt”.

Для этого можно использовать аргумент -o, который означает “логический оператор OR”.

Но мы также должны использовать обратную косую черту ‘\’, чтобы раскрыть круглые скобки

$ ls *
file_0.gif  file_z.txt  not-a-gif  not-a-txt

dir1:
file_1.gif  file_a.txt  not-a-gif  not-a-txt

dir2:
file_2.gif  file_b.txt  not-a-gif  not-a-txt

dir3:
file_3.gif  file_c.txt  not-a-gif  not-a-txt

dir4:
file_4.gif  file_d.txt  not-a-gif  not-a-txt

$ find . \( -name "*.gif" -o -name "*.txt" \) -exec rm -v {} \;
removed './dir1/file_1.gif'
removed './dir1/file_a.txt'
removed './dir3/file_3.gif'
removed './dir3/file_c.txt'
removed './dir2/file_2.gif'
removed './dir2/file_b.txt'
removed './file_0.gif'
removed './file_z.txt'
removed './dir4/file_d.txt'
removed './dir4/file_4.gif'

Здесь видно, что все файлы с расширением ‘txt’ и файлы с расширением ‘gif’ удаляются рекурсивно.

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

Заключение

В этой статье мы рассмотрели удаление файлов с определенным расширением.

Мы также рассмотрели рекурсивный поиск и удаление этих файлов.

 

Добавить комментарий