У вас может возникнуть ситуация, когда необходимо удалить несколько файлов, имеющих определенное расширение.
Это руководство поможет вам сделать именно это.
Вы используете команду rm для удаления файлов и папок следующим образом:
rm [option] filename
Может показаться, что здесь нужно знать точные имена файлов, но это не так.
Позвольте мне показать вам несколько методов удаления нескольких файлов на основе их расширения.
- Способ 1: Как удалить файлы по расширению с помощью команды rm
- Интересно, как это работает? Подстановочные знаки!
- Точка между * и расширением очень важна!
- Метод 2: Рекурсивное удаление файлов с определенным расширением с помощью команды find
- бонусный совет: Используем команду find для работы с файлами с несколькими расширениями
- Заключение
Способ 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 отдельно для каждого типа расширения файла было бы проще, и вы не ошибетесь.
Заключение
В этой статье мы рассмотрели удаление файлов с определенным расширением.
Мы также рассмотрели рекурсивный поиск и удаление этих файлов.