Удалить все файлы с расширением linux
Обновлено: 21.11.2024
Иногда вы попадаете в ситуацию, когда вам нужно удалить все файлы в каталоге или просто очистить каталог, удалив все файлы, кроме файлов определенного типа (оканчивающихся определенным расширением).
В этой статье мы покажем вам, как удалять файлы в каталоге, за исключением файлов с определенными расширениями или типами, с помощью команд rm, find и globignore.
Прежде чем мы двинемся дальше, давайте начнем с краткого рассмотрения одной важной концепции Linux — сопоставления имен файлов с образцом, которая позволит нам решить нашу проблему.
В Linux шаблон оболочки представляет собой строку, состоящую из следующих специальных символов, называемых подстановочными знаками или метасимволами:
- * — соответствует нулю или более символов <ли>? – соответствует любому одиночному символу
- [seq] — соответствует любому символу в seq.
- [!seq] — соответствует любому символу, не указанному в seq
Здесь мы рассмотрим три возможных метода, в том числе:
Удаление файлов с помощью расширенных операторов сопоставления с образцом
Различные расширенные операторы сопоставления с образцом перечислены ниже, где список-образцов – это список, содержащий одно или несколько имен файлов, разделенных символом | персонаж:
- *(список-шаблонов) — соответствует нулю или более вхождений указанных шаблонов
- ?(список-шаблонов) – соответствует нулю или одному вхождению указанных шаблонов.
- +(список-шаблонов) — соответствует одному или нескольким вхождениям указанных шаблонов
- @(список-шаблонов) — соответствует одному из указанных шаблонов
- !(список-шаблонов) – соответствует чему угодно, кроме одного из заданных шаблонов
Чтобы использовать их, включите параметр оболочки extglob следующим образом:
<р>1. Чтобы удалить все файлы в каталоге, кроме имени файла, введите команду ниже:<р>2. Чтобы удалить все файлы, кроме filename1 и filename2:
<р>3. В приведенном ниже примере показано, как в интерактивном режиме удалить все файлы, кроме всех ZIP-файлов:
<р>4. Затем вы можете удалить все файлы в каталоге, кроме всех файлов .zip и .odt, следующим образом, отображая при этом, что делается:
После получения всех необходимых команд отключите параметр оболочки extglob следующим образом:
Удалить файлы с помощью команды find в Linux
В соответствии с этим методом мы можем использовать команду find исключительно с соответствующими параметрами или в сочетании с командой xargs, используя конвейер, как в формах ниже:
<р>5. Следующая команда удалит все файлы, кроме файлов .gz в текущем каталоге:<р>6. Используя конвейер и xargs, вы можете изменить приведенный выше случай следующим образом:
<р>7. Давайте рассмотрим еще один пример. Приведенная ниже команда удалит все файлы, кроме файлов .gz , .odt и .jpg в текущем каталоге:
Удалить файлы с помощью переменной Bash GLOBIGNORE
Однако этот последний подход работает только с bash. Здесь переменная GLOBIGNORE хранит разделенный двоеточиями список шаблонов (имен файлов), которые следует игнорировать при раскрытии пути.
Чтобы использовать этот метод, перейдите в каталог, который вы хотите очистить, затем установите переменную GLOBIGNORE следующим образом:
В этом случае все файлы, кроме файлов .odt , .iso и .txt, будут удалены из текущего каталога.
Теперь запустите команду для очистки каталога:
После этого отключите переменную GLOBIGNORE:
Примечание. Чтобы понять значение флагов, используемых в приведенных выше командах, обратитесь к справочным страницам каждой команды, которую мы использовали на различных иллюстрациях.
Вот и все! Если у вас есть какие-либо другие методы командной строки для той же цели, не забудьте поделиться с нами через наш раздел обратной связи ниже.
Если вам понравилась эта статья, подпишитесь на уведомления по электронной почте о руководствах по Linux. Если у вас есть вопросы или сомнения? обратитесь за помощью в разделе комментариев.
Если вы цените то, что мы делаем здесь, в TecMint, вам следует подумать о следующем:
TecMint – это самый быстрорастущий и пользующийся наибольшим доверием сайт сообщества, где можно найти любые статьи, руководства и книги по Linux в Интернете. Миллионы людей посещают TecMint! для поиска или просмотра тысяч опубликованных статей, доступных всем БЕСПЛАТНО.
Если вам нравится то, что вы читаете, купите нам кофе (или 2) в знак признательности.
Мы благодарны за вашу бесконечную поддержку.
Похожие записи
18 мыслей о «3 способа удалить все файлы в каталоге, кроме одного или нескольких файлов с расширениями»
Для меня рабочим методом было «Удалить файлы с помощью переменной Bash GLOBIGNORE».
Моя цель состояла в том, чтобы оставить только некоторые видео- и аудиофайлы, независимо от нижнего/верхнего регистра:
Надеюсь, это поможет…
Я пытаюсь удалить файлы из нескольких каталогов с помощью сценария оболочки, в некоторых каталогах файлы будут иметь расширение (.csv), а в некоторых — только буквенно-цифровые имена.
Теперь проблема в том, что для файлов с расширением я использую приведенную ниже строку команды, которая работает должным образом.
но для каталога с файлами без расширения я использую команду «rm», как показано ниже, которая запрашивает разрешение на удаление каждого файла.
Примечание:
- Я не могу изменить права доступа к каталогу.
- Я также не хочу удалять какие-либо подкаталоги.
В темах 6 и 7 есть опечатки. В некоторых расширениях нет *. .
Здравствуйте, спасибо, что удалили мои ценные файлы. По крайней мере, обратите внимание, что ваш метод shopt НЕ работает для каталогов (например, rm -rfv !(“dirname”))
О, извините за потерю ваших ценных файлов, но заголовок/название достаточно ясно указывает на удаление файлов с определенным расширением. И все команды показывают удаление файлов, например $ rm -v !("имя файла"), а не имя каталога. В следующий раз не пытайтесь делать то, что выходит за рамки руководства, ожидая таких же результатов.
Каталог — это файл, ваше понимание Linux и ваше руководство — это шутки. Если вы не можете сделать руководство понятным, значит, вы либо не понимаете, о чем говорите, либо плохо объясняете. В следующий раз не пытайтесь делать то, что вы не хотите делать должным образом, и учитесь, прежде чем учить. Спасибо.
Если каталог содержит подкаталоги, которые могут содержать или не содержать файлы с определенным расширением, как рекурсивно удалить все остальные файлы из подкаталогов, не удаляя наши файлы с определенным расширением.
что такое shopt -s extglob? и почему я не могу удалить без использования этой команды, например rm -v !("*.gz").
Отличная информация.
Спасибо
Добро пожаловать! Большое спасибо за добрые слова благодарности, а также за то, что следите за нами.
Хорошие советы, спасибо за это, меня беспокоит только то, что если вы сделаете что-то не так, вы удалите файлы, которые не хотите удалять… Я подумал, что лучше переместить файл, который вы хотите временно сохранить в другом месте, а затем удалите все файлы в каталоге и замените те, которые вы хотите сохранить…
Добро пожаловать, и хороший совет. Что-то может пойти не так, особенно когда вы вводите неправильную команду, как вы упомянули, всегда рекомендуется делать резервную копию перед удалением файлов.
Вероятно, следует сказать, что «две отрицательные команды не приводят к положительному результату», особенно если у вас нет метода отмены. Таким образом, удаление некоторых типов файлов кажется немного пугающим.
Создание резервной копии до того, как вы это сделаете, кажется дополнительной работой. В любом случае, я обычно пытаюсь найти неразрушающую операцию, такую как ls, чтобы убедиться, что что-то вроде этого делает то, что я хочу, прежде чем я даже подумаю об использовании rm.
В частности, недеструктивная команда, которая конкретно перечисляет, что вы будете удалять с помощью rm лучше всего. Возможно, было бы неплохо сначала использовать mv.
Хорошо сказано, и это хороший совет, как вы объяснили здесь, однако очистка каталога путем удаления всех файлов, кроме нескольких, вероятно, является намерением пользователя. И прежде чем делать какое-либо удаление файлов, нужно знать, зачем он это делает, удалить ли старые файлы определенного типа или просто освободить место на диске и так далее.
Наконец, цель этой статьи – предоставить решение для ситуации, когда вы можете удалить все файлы в каталоге, но должны оставить те, которые заканчиваются заданным расширением.
find, которым я пользовался, но два других являются новыми и до сих пор мне неизвестны. Но они есть в моей базе данных Linux благодаря вам. ;-)
Добро пожаловать и спасибо, что поделились с нами своими мыслями. Мы всегда рады помочь нашим подписчикам узнать что-то новое о Linux, поскольку мы также надеемся учиться у них.
Любопытно, что все упомянутые здесь инструменты (rm, find, shopt) и в основном концепции (GLOBIGNORE, wildcard) взяты из проекта GNU, но вы отдаете все должное проекту Linux. Я думаю, что это неправильная позиция в отношении проекта GNU, которая заслуживает как заслуга Linux Project.
Это важная проблема, связанная с поддержкой F.O.S.S в целом, мы будем делать то, о чем вы говорили в каждой будущей статье. Однако в прошлом мы всегда отдавали должное проектам Linux и GNU.
Есть что сказать? Присоединяйтесь к обсуждению. Отменить ответ
Этот сайт использует Akismet для уменьшения количества спама. Узнайте, как обрабатываются данные ваших комментариев.
Чтобы удалить файлы с определенным расширением, мы используем команду rm (Удалить), которая представляет собой базовую утилиту командной строки для удаления системных файлов, каталогов, символических ссылок, узлов устройств, каналов и сокетов в Linux.
Эта команда довольно проста в использовании, и ее основной синтаксис таков:
Здесь «имя файла1», «имя файла2» и т. д. — это имена файлов, включая полный путь. Если файлы находятся в одном и том же каталоге, то, как вы, возможно, уже знаете, нет необходимости записывать полные пути.
Мы также можем использовать выражения с подстановочными знаками для указания файлов с похожими или добавочными именами или для указания файлов с определенным расширением.
Удалить файлы в Linux с помощью подстроки
Например, чтобы удалить все файлы, содержащие подстроку «тест», мы можем запустить:
Здесь "*" означает "любая строка". Следовательно, шаблон «*test*» рассматривает все файлы, имена которых содержат подстроку «test».
Удалить файл, используя подстроку имени файла
Удалить файлы с расширением файла в Linux
Возьмем другой пример. Мы попытаемся удалить все файлы GIF из папки, используя следующее:
Удалить файлы с определенным расширением
Однако этот синтаксис работает только для файлов. Используя аргумент '-r', мы можем удалить как файлы, так и папки:
Обратите внимание, что это рекурсивно удалит папку полностью, т. е. удалит всю структуру папок под ней; вложенные папки и все файлы. Следовательно, невозможно рекурсивно удалить определенные файлы с шаблоном имен файлов или файлы с определенным расширением. Каждый раз вся структура папок удаляется.
Рекурсивное удаление файлов с расширением файла в Linux
Для этого мы можем использовать команду find и направить ее вывод в «rm». Команда find просто используется для рекурсивного поиска файлов на основе таких параметров, как имя файла, расширение, размер и т. д.
Например, для рекурсивного поиска файлов с расширением «.jpg» мы выполняем следующее:
Рекурсивный поиск файлов с расширением
Теперь мы просто передаем этот вывод в ‘rm’ следующим образом:
Рекурсивное удаление файлов с расширением
Команда «xargs» просто используется для передачи вывода «find» в «rm» в качестве аргументов. Таким образом, мы рекурсивно удалили файлы с расширением PNG из всей структуры папок.
Заключение
В этой статье мы узнали о команде rm, о том, как с ее помощью удалять файлы и папки, а также о том, как рекурсивно удалять файлы с определенными расширениями.
Если у вас есть какие-либо вопросы или отзывы, сообщите нам об этом в комментариях ниже.
Как безопасно удалить все файлы с определенным расширением (например, .bak ) из текущего каталога и всех подпапок с помощью одной командной строки? Просто я боюсь использовать rm, так как однажды я использовал его неправильно, и теперь мне нужен совет.
8 ответов 8
В этом случае вам даже не нужно использовать rm, если вы боитесь. Используйте поиск :
Но используйте его с осторожностью. Выполнить сначала:
чтобы увидеть, какие именно файлы вы удалите.
Кроме того, убедитесь, что -delete является последним аргументом в вашей команде. Если вы поместите его перед аргументом -name *.bak, он удалит все.
Дополнительную информацию см. в разделах man find и man rm, а также см. соответствующий вопрос в SE:
При настройках по умолчанию rm *.bak удалит только все файлы, оканчивающиеся на .bak, в текущем каталоге. Чтобы также делать что-то в подкаталогах, вам нужно было возиться с глобусами, используйте параметр -r или используйте пример поиска.
@Hennes Будьте осторожны с rm -r *.bak ! Он также удаляет каталоги, оканчивающиеся на .bak, со всем их содержимым.
Убедитесь, что -delete является последним аргументом вашей команды. Если вы поместите его перед аргументом -name *.bak, все будет удалено.
Добро пожаловать в аскубунту! Хотя это совершенно правильный ответ, я не думаю, что есть какое-то преимущество в использовании этого вместо флага -delete find . Дополнительную информацию об удалении файлов с помощью find можно найти в разделе руководств GNU.
Это не просто альтернатива, а пример того, как другие команды могут быть объединены с вертикальной чертой '|'. +1
Сначала введите команду shopt -s globstar . Вы можете запустить это в командной строке, и это будет работать только в этом окне оболочки. Вы можете поместить его в свой .bashrc, и тогда все вновь запущенные оболочки подхватят его. Результатом этой команды является рекурсивное сопоставление **/ файлов в текущем каталоге и его подкаталогах (по умолчанию **/ означает то же самое, что и */ : только в ближайших подкаталогах). Затем:
(или gvfs-trash **/*.bak или что там у вас).
Удаление файлов для меня не то, для чего вы должны использовать rm. Вот альтернатива:
Как отмечает Флимм в комментариях:
Пакет trash-cli делает то же самое, что и gvfs-trash, но не зависит от gvfs.
Для этого не нужно создавать псевдоним, потому что в пакете trash-cli есть команда trash , которая делает то, что нам нужно.
Как поясняет Элиа Каган в обширных комментариях, вы также можете сделать это рекурсивным, используя find . В этом случае вы не можете использовать псевдоним, поэтому приведенные ниже команды предполагают, что вы установили trash-cli. Подытожу комментарии Элии:
Эта команда находит и отображает все файлы .bak и символические ссылки в любом месте текущего каталога или его подкаталогов или ниже.
Чтобы удалить их, добавьте -exec к команде корзины:
-xtype f выбирает файлы и символические ссылки на файлы, но не на папки. Чтобы также удалить папки .bak, удалите эту часть и используйте -execdir , что позволяет избежать неустранимых ошибок для файлов .bak внутри каталогов .bak:
Если я установлю текущий/рабочий каталог (переходя к нему с помощью cd ) в какой-то конкретный каталог, а затем наберу:
Что будет делать эта команда? Верно ли, что приведенная выше команда удалит файлы с расширением .xvg только в рабочем каталоге?
Я боялся попробовать это, прежде чем спрашивать, потому что я хочу быть абсолютно уверенным, что приведенная выше команда удалит только файлы .xvg, НАХОДЯЩИХСЯ В РАБОЧЕМ КАТАЛОГЕ.
4 ответа 4
Да, rm *.xvg только удалит файлы с указанным расширением в вашем текущем каталоге.
Хороший способ убедиться, что вы действительно находитесь в каталоге, из которого хотите удалить файлы, — это использовать команду pwd, которая отобразит ваш текущий каталог, а затем выполнить ls, чтобы убедиться, что вы нашли файлы. вы ожидаете.
Если вы немного опасаетесь запускать команду rm, вы можете сделать две вещи:
введите ls *.xvg, чтобы увидеть список файлов, на которые повлияет эта команда.
Если у вас много файлов, вы всегда можете использовать параметр командной строки -i для rm (также существует для cp и mv ). Использование rm -i *.xvg предложит вам для каждого отдельного файла, можно ли его удалить, поэтому вы можете быть уверены, что ничего, чего вы не ожидали, не было удалено. (Это будет утомительно, если у вас много файлов :)
Вам не нужно переходить в каталог, просто используйте
В случае опечатки или подобной ошибки в пути, где /som/dir не существует:
случайно удалит все файлы .xvg в текущем каталоге. Первая команда не будет, и вам не нужно снова выполнять cd.
Альтернативным способом может быть использование find:
find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete у меня сработало! используйте -maxdepth "n", чтобы удалить соответствующие файлы в подкаталоге, если указан путь
Да, rm *.xvg удалит только файлы, заканчивающиеся на .xvg, в вашем текущем каталоге. Вот почему.
Когда вы вводите такую команду, работа распределяется между используемой оболочкой (допустим, bash) и двоичным кодом команды.
Вы можете найти двоичный файл, набрав rm . Эта небольшая программа позаботится об удалении файлов. Такие программы можно запускать из командной строки, и они могут читать список аргументов prog arg1 arg2 arg3 при запуске. В случае rm они интерпретируются как список полных имен файлов, которые необходимо удалить. Таким образом, если вы находитесь в каталоге, содержащем файл foo.bar , набрав 'foo.*', вы получите rm: foo.*: Нет такого файла или каталога. Обратите внимание на одинарные кавычки вокруг шаблона файла, они говорят оболочке передать аргумент оболочке как есть.
Однако, если вы введете rm *.bar в том же каталоге, файл будет удален. Здесь происходит следующее: ваша оболочка, программа, которую вы используете для ввода команд, выполняет некоторые преобразования перед передачей аргументов команде. Один из них называется «расширение имени файла», иначе известное как «подстановка». Вы можете увидеть список расширений имен файлов bash здесь. Одним из наиболее распространенных расширений является * , который расширяется до имен файлов в текущем каталоге.
Простым способом посмотреть на работу глобусов является использование команды echo , которая выводит все аргументы, переданные ей через оболочку. Таким образом, ввод echo * в том же каталоге выведет foo.bar . Итак, когда вы вводите rm *.bar , на самом деле происходит то, что оболочка расширяет список аргументов до foo.bar , а затем передает его команде rm.
Существует несколько способов управления подстановкой. Например, в последних версиях bash вы можете включить параметр под названием globstar, который будет выполнять рекурсивное расширение. Набрав echo **/*.bar, вы увидите список всех файлов, оканчивающихся на .bar, во всех подпапках. Таким образом, ввод rm **/*.bar в bash с поддержкой globstar действительно рекурсивно удалит все соответствующие файлы во вложенных папках.
Читайте также: