Удаление всех файлов с расширением txt в папках и подпапках корневого каталога

Обновлено: 21.11.2024

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

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

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

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

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

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

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

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

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

Чтобы использовать их, включите параметр оболочки 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», как показано ниже, которая запрашивает разрешение на удаление каждого файла.

Примечание:

  1. Я не могу изменить права доступа к каталогу.
  2. Я также не хочу удалять какие-либо подкаталоги.

В темах 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.

Это важная проблема, связанная с поддержкой F.O.S.S в целом, мы будем делать то, о чем вы говорили в каждой будущей статье. Однако в прошлом мы всегда отдавали должное проектам Linux и GNU.

Есть что сказать? Присоединяйтесь к обсуждению. Отменить ответ

Этот сайт использует Akismet для уменьшения количества спама. Узнайте, как обрабатываются данные ваших комментариев.

Как безопасно удалить все файлы с определенным расширением (например, .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:

У меня есть структура каталогов в Windows Server 2003R2. Я хочу удалить файлы в указанной структуре, но сохранить каталоги/папки нетронутыми.

Я предполагаю, что для этого есть сценарий, но я не знаю ни скриптов, ни PowerShell.

Кто-нибудь может мне помочь?

Популярные темы в Windows Server

По сути, просматривайте дерево рекурсивно, удаляя все, что не является "контейнером" (то есть папкой).

24 ответа

По сути, просматривайте дерево рекурсивно, удаляя все, что не является "контейнером" (то есть папкой).

Кризз

PS не требуется. Пакетный скрипт сделает:

как насчет "del . /s /q" (замените . любым типом файла с подстановочным знаком, который вы хотите удалить).

Рикиби

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

Кризз, ваш пакет также удалит подпапки, вам нужно их отфильтровать.

Сценарий PS от EdT должен помочь :)

rickybee написал:

Не могли бы вы просто поискать в верхней папке все файлы; *.*, то просто удалить их все?

Вы спрашиваете или говорите?

Как бы вы искали? Какую программу/скрипт вы бы использовали? Как бы вы выбрали файлы после поиска и выполнили удаление?

Кризз

rickybee написал:

Не могли бы вы просто поискать в верхней папке все файлы; *.*, то просто удалить их все?

Скорее всего, ему нужен автоматизированный скрипт, который сделает это без присмотра.

Кризз

Альфред Вильсмайер написал:

Кризз, ваш пакет также удалит подпапки, вам нужно их отфильтровать.

Нет, не будет. Даже если есть вложенная папка, соответствующая маске *.*, команда del не будет работать с ней, так как она удаляет только файлы, а не папки.

Что касается предложения rickybee, если мы говорим о папке с МНОЖЕСТВОМ файлов, она может не работать или даже привести к сбою сервера.

Я бы выбрал сценарий PS, предложенный EdT.

Альфред Вильсмайер написал:

Кризз, ваш пакет также удалит подпапки, вам нужно их отфильтровать.

Сценарий PS EdT должен сделать это. трюк :)

нет — вы не можете удалить каталог с помощью команды del — структура папок останется на месте.

Del /a /q /f path-to-dir удалит все файлы в каталоге, но не удалит сам каталог (даже если он пуст).

[отредактировано в соответствии с командой Кризза]

Мартин9700

Для полноты в Powershell 3.0 есть удобная функция для получения только файлов:

Осторожно, команда -Force в командлете Get-ChildItem также найдет все скрытые или системные файлы. -Force на Remove-Item удалит его, несмотря ни на что. Также можно добавить в команду параметр -Confirm:$False, чтобы не запрашивать удаление каждого файла.

Кризз

da Beast написал:

как насчет "del . /s /q" (замените . любым типом файла с подстановочным знаком, который вы хотите удалить).

Вы действительно правы. Не может быть проще, чем это. Я бы добавил только переключатели /f и /a, чтобы он также удалял скрытые, системные файлы и файлы только для чтения.

К сожалению, вы, ребята, правы, и "del" не будет работать с папками, поэтому он должен быть действительным :)

Боже, я заржавел. лол

Только что сделал пробный запуск, и "del . /s /q" почти сработал.

Как ни странно, он *не* удалил ZIP-файл в одной из подпапок.

Рикиби

Чтобы уточнить мой предыдущий пост, то, что я сделал в прошлом, это открыть «Компьютер» и перейти к папке верхнего уровня (которая меня интересует) с левой стороны. Затем в поле поиска вверху справа введите *.*. Это вызывает каждый файл/папку в этой папке и ее подпапках. Затем я просто щелкнул первый файл, Shift щелкнул последний файл и нажал «Удалить». Я также использовал этот метод, чтобы выбрать файлы старше определенной даты, чтобы очистить папки текстового процессора и т. д.

Мартин9700

rickybee написал:

Чтобы уточнить мой предыдущий пост, то, что я сделал в прошлом, это открыть «Компьютер» и перейти к папке верхнего уровня (которая меня интересует) на левая сторона. Затем в поле поиска вверху справа введите *.*. Это вызывает каждый файл/папку в этой папке и ее подпапках. Затем я просто щелкнул первый файл, Shift щелкнул последний файл и нажал «Удалить». Я также использовал этот метод, чтобы выбрать файлы старше определенной даты, чтобы очистить папки обработки текстов и т. д.

Это тоже можно автоматизировать с помощью Powershell :)

Рикиби

Martin9700 написал:

rickybee написал:

Чтобы прояснить мой предыдущий пост, что я сделал в прошлом, откройте «Компьютер», перейдите на верхний уровень папка (которая меня интересует) слева. Затем в поле поиска вверху справа введите *.*. Это вызывает каждый файл/папку в этой папке и ее подпапках.Затем я просто щелкнул первый файл, Shift щелкнул последний файл и нажал «Удалить». Я также использовал этот метод, чтобы выбрать файлы старше определенной даты, чтобы очистить папки обработки текстов и т. д.

Это тоже можно автоматизировать с помощью Powershell :)

Ага, как говорится, способов расколоть орех не один.

Кризз

rickybee написал:

Чтобы уточнить мой предыдущий пост, (. )

На самом деле Оки не уточнил, нужно ли ему, чтобы это выполнялось автоматически без присмотра, поэтому, возможно, он хотел одноразового решения. В этом случае ваше решение не хуже других :)

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

Я видел сбои серверов или просто нехватку памяти. однако это идеально подходит для небольших папок.

И снова, если вы хотите автоматизировать процесс, этот подход больше не подходит :)

EdT писал:

Только что сделал тестовый прогон, и "del . /s /q" почти сработал.

Странно, но *не* удалите ZIP-файл в одной из подпапок.

хм. возможные проблемы с правами или что-то в этом роде. Что особенного в этом файле? Он помечен как системный файл? Был ли применен другой набор разрешений (запретить удаление) или что-то в этом роде?

Может быть, он видит zip как папку?

Были ли удалены другие ZIP-файлы?

Кризз

Команда

@EdT: del должна была вывести ошибку. Что это было?

Если zip-файл был системным, скрытым или доступным только для чтения, del . /s /q не удалит его.

Я ценю все предложения и комментарии. Хороший материал.

Я только что создал тестовую структуру с двумя папками, каждая из которых содержит еще две.

Я создал в них случайные файлы: текстовые файлы, текстовые документы, электронные таблицы Excel и один zip-файл.

Я исправляю свое предыдущее утверждение; Должно быть, я находился в одной из подпапок, когда выполнял команду «del /s /q», потому что я только что попробовал ее сверху, и zip-файл был удален нормально.

Эта тема заблокирована администратором и больше не открыта для комментариев.

Чтобы продолжить это обсуждение, задайте новый вопрос.

Щелкни! Lapsus$, Excel RAT, Honda Hackers, Lunar Landers, Windows Easter Egg

Ваша ежедневная доза технических новостей. Вы должны это услышать. Подозреваемые Lapsus$ арестованы за взломы Microsoft, Nvidia, Okta. Больше информации о группе Lapsus$, ответственной за ряд недавних кибератак. Несколько из группы».

Искра! Серия Pro — 25 марта 2022 г.

Friday Из бесплатной энциклопедии Википедии. Другие значения см. в Friday (значения). Пятница — день недели между четвергом и субботой. В странах, принимающих обычай "понедельник-первый".

Очень необычный спам. Ответить на темы + ссылка OneDrive + файл PWD

Поэтому я недавно заметил резкое увеличение входящего спама и заметил очень необычный новый спам. Он имеет несколько очень специфических характеристик, которые отличают его от обычных спам-сообщений: 1 – он содержит настоящие цепочки ответов по электронной почте2 – он содержит настоящие имена.

Есть ли недостатки безопасности при использовании VPN?

Недавно я начал использовать VPN на некоторых своих устройствах как один из способов внедрения более эффективных методов работы с персональными компьютерами. Но кажется, что некоторые учетные записи, в которые я вхожу, используются для входа с одного из 2 или 3 IP-адресов. - поэтому, когда я пытаюсь войти в систему, пока вы.

Давайте поздравим SpiceRex с днем ​​рождения, поскольку ему исполняется 12 лет!

Хотите верьте, хотите нет, но 27 марта 2022 года SpiceRex исполняется 12 лет!Те из вас, кто был в сообществе Spiceworks какое-то время, вероятно, уже знают, кто такой большой оранжевый тираннозавр рекс. Но некоторые из наших участников могут этого не делать, так что давайте немного истории.

Примечание. Если вы считаете, что каталог находится не на своем месте, и вы не хотите его удалять, попробуйте переместить его в другое место. Чтобы узнать, как это сделать, посетите нашу статью Как перемещать каталоги в Linux.

Как удалить файлы Linux

Команда rm удаляет файлы в Linux. Команда отменяет связь данных с именем файла, позволяя пользователю перезаписать это конкретное место хранения.

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

Команду rm можно использовать для одновременного удаления нескольких файлов:

С этой командой можно использовать подстановочные знаки.

Например, чтобы удалить все файлы с именем .bmp, введите:

Этот метод также используется для удаления всех файлов, содержащих строку символов:

Это удалит все файлы, в имени которых есть образец слова.

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

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

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

Примечание. После того как команда rm удалит файл, вы не сможете получить к нему доступ. Единственный способ получить файл — это восстановить его из резервной копии (если она доступна).

Параметры команды rm

Вы можете настроить работу команды rm, добавив параметры. Параметр — это дефис, за которым следует одна или несколько букв, обозначающих команды.

Если вы удаляете несколько файлов, добавьте запрос на подтверждение. Используйте параметр –i для использования интерактивного диалога:

Подтвердите удаление файлов, введя «да» или «нет».

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

Вывод подтверждает, что файл test.txt был успешно удален.

Чтобы принудительно удалить файл, защищенный от записи, используйте параметр –f:

Чтобы использовать привилегии sudo для файла с надписью "Отказано в доступе" и удалить его:

Как удалить каталог в Linux

Каталог linux (или папка) может быть пустым или содержать файлы. Чтобы удалить каталог в Linux, используйте одну из следующих двух команд:

  • команда rmdir — удаляет пустые каталоги/папки
  • команда rm — удаляет каталог/папку вместе со всеми файлами и подкаталогами в ней

Удалить каталог Linux с помощью команды rm

Добавив параметр -r (-R) к команде rm, вы можете удалить каталог вместе со всем его содержимым.

Чтобы удалить каталог (и все, что внутри него), используйте параметр –r, как в команде:

Появится запрос на подтверждение перед удалением.

Чтобы удалить каталог без подтверждения:

Кроме того, вы можете удалить несколько каталогов или папок одновременно:

Удалить каталоги в Linux с помощью команды rmdir

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

Основной синтаксис, используемый для удаления пустых папок/каталогов Linux:

Кроме того, вы можете удалить сразу несколько пустых каталогов, набрав:

Если команда находит контент в одном из перечисленных каталогов, она пропустит его и перейдет к следующему.

Примечание. Чтобы безвозвратно удалить файл в Linux путем его перезаписи, используйте команду shred.

С помощью этого руководства удаление файлов и каталогов в Linux стало проще. Команды rm и rmdir являются гибкими с множеством доступных опций.

Читайте также: