Удалить файлы по шаблону linux

Обновлено: 24.11.2024

Найти все файлы (рекурсивно), в имени которых есть символ подчеркивания, а затем удалить их через командную строку.

4 ответа 4

Это самый безопасный и быстрый вариант:

Он не требует конвейерной обработки и не прерывается, если файлы содержат пробелы, подстановочные символы или что-то еще, что может заглушить другие конструкции. Здесь проще всего запомнить правило: никогда не анализировать вывод. И никогда не используйте grep для имен файлов, если вы хотите что-то с ними сделать позже. С помощью find можно делать практически все что угодно.

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

Если вам нужны только обычные файлы:

Подсказка, если вы используете \+ вместо \; ваша команда будет работать быстрее, так как она подставит имена всех найденных файлов вместо того, чтобы вызывать rm по одному.

Хорошо, давайте сделаем это постепенно.

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

Но, конечно, это ужасно неэффективно. Он запускает целый процесс rm для каждого отдельного файла. Итак, хотя мы могли бы сделать небольшой обход через \+, это не то место, где мы закончим, поэтому давайте выберем более короткий путь и добавим xargs для объединения имен файлов в группы:

Но у него есть две дыры в безопасности. Во-первых, если какое-либо найденное имя файла начинается со знака минус, rm будет рассматривать его как параметр командной строки, а не как имя файла, и выдаст ошибку. (Версия -exec rm <> также имеет эту проблему.) Во-вторых, xargs не будет правильно обрабатывать имена файлов, содержащие пробелы. Так что дальнейшая итерация должна сделать это немного более пуленепробиваемым:

И, конечно же, есть интерактивные функции rm, которые вам, вероятно, не нужны:

Параметры -print0 и -0 не являются стандартными, но find и xargs GNU, а также find и xargs FreeBSD их понимают. Однако даже это поправимо. Нам вообще не нужно создавать какие-либо дополнительные процессы. И GNU, и FreeBSD find могут вызывать системный вызов unlink(2) напрямую:

В качестве последней превентивной меры, чтобы в определенных обстоятельствах вы не делали больше, чем планировали, помните, что файловая система может содержать не только обычные файлы:

Invicti Web Application Security Scanner — единственное решение, обеспечивающее автоматическую проверку уязвимостей с помощью Proof-Based Scanning™.

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

Обеспечьте безопасность приложений правильно! Обнаружение, защита, мониторинг, ускорение и многое другое…

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

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

  • Осторожно используйте приведенные ниже команды, особенно те, которые используют регулярные выражения или некоторые шаблоны поиска с помощью команды find. Неправильное выражение или шаблон могут привести к удалению важных данных/системных файлов или просто ненужных файлов.
  • Всегда сохраняйте последнюю резервную копию важных данных и системных файлов.
  • Будьте осторожны, прежде чем запускать такие команды, особенно если вы запускаете их с помощью Sudo или суперпользователя (root).

Удалить с помощью отмены связи

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

Удалить один файл

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

rm предлагает вам подтвердить удаление файлов, защищенных от записи, в противном случае он переходит к непосредственному удалению файла. Чтобы rm всегда спрашивал перед удалением файла, используйте флаг -i:

Команда

rm удаляет без отображения каких-либо сообщений на экране. Чтобы узнать, что на самом деле делает команда rm, используйте rm с флагом -v.

Чтобы удалить защищенные от записи файлы без запроса подтверждения, используйте флаг -f.

Удалить несколько файлов

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

rm также поддерживает регулярные выражения. Если вы хотите удалить все файлы с именем file-name-* , вы можете использовать:

Мы также можем указать несколько файлов с помощью регулярных выражений. Если мы хотим удалить три файла, которые соответствуют имени файла-1, имени файла-2 и имени файла-3, мы можем использовать что-то вроде:

Удалить каталог

Пустой каталог можно удалить с помощью команды rm с параметром -d.

Параметры, поддерживаемые для удаления файлов, также можно комбинировать с удалением каталогов с помощью флага -d. Например:

Чтобы удалить непустой каталог, используйте флаг -r.

Если вам не нужны запросы перед удалением каталога и его содержимого, используйте флаг -rf. Это удалит все внутри каталога, включая сам каталог, без какого-либо подтверждения. Будьте осторожны при использовании, особенно в качестве root.

Найти и удалить файлы

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

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

Современные версии команды find поддерживают внутреннюю функцию удаления. Здесь флаг -delete заменяет команду rm, а -depth указывает команде find сначала обработать содержимое каталога перед самим каталогом:

Приведенный выше пример более эффективен при работе с большим количеством файлов, поскольку он не создает новый внешний процесс для команды rm для каждого совпавшего файла. Но не все версии команды find (пока) могут поддерживать флаг -delete. В качестве альтернативы у нас есть возможность использовать команду xargs с поиском, как показано в следующем примере ниже:

Или используйте команду exec + терминатор, чтобы связать воедино все, что было найдено командой find, например xargs:

По умолчанию команда find использует флаг -print, который мы обычно не записываем. С xargs нам нужно избегать символа новой строки между именами файлов. Таким образом, флаг -print0 указывает find печатать нулевой символ после каждого найденного имени файла.

Аналогично мы указываем флаг -0 с xargs, чтобы обе команды совпадали. Здесь команда rm удаляет файл, переданный по каналу поиска. Например, приведенная ниже команда будет искать и удалять все файлы *.tmp из домашнего каталога текущего пользователя (обозначается символом ~).

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

Найти и удалить файлы пользователем

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

В приведенном выше примере флаг -mindepth со значением 1 предотвращает удаление каталога, заданного параметром , если он соответствует шаблону и критериям поиска. Или, чтобы удалить все внутри данного каталога, принадлежащего определенной группе, используйте:

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

Вот пример выполнения:

Если вместо этого вы хотите указать идентификатор пользователя и идентификатор группы, вы можете попробовать что-то вроде:

Найти и удалить пустые каталоги

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

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

Найти и удалить файлы старше X

Иногда может потребоваться удалить файлы старше x дней. find имеет параметры для чтения времени создания файла (ctime), доступа (atime) и модификации (mtime). Мы можем использовать параметр mtime с функцией поиска, чтобы найти и удалить файлы, измененные более x дней назад.

Например, чтобы удалить все файлы с расширением log внутри /var/tmp со временем модификации 30 дней назад или более, мы можем использовать:

Найти и удалить файлы по разрешению

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

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

Подведение итогов

Linux предлагает простые команды unlink , rm и rmdir, которые можно легко расширить с помощью регулярных выражений. Для более сложных потребностей у вас есть возможность использовать комбинацию таких инструментов, как find и xargs, чтобы добиться того, что вам нужно. Помимо примеров в этой статье, у вас есть возможность использовать поиск с любым из доступных флагов для настройки поиска. Обратитесь к справочным страницам для соответствующих команд, чтобы узнать о них больше.

Всегда запускайте команды find без флага rm или -delete и анализируйте их вывод, чтобы узнать, какие файлы или каталоги будут затронуты выполнением фактической команды. Правильная конфигурация и политика резервного копирования помогают не только в случае случайного удаления, но и в случае сбоя оборудования и кибератак.

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

2. Удалить один файл:

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

Если файл защищен от записи, rm попросит вас подтвердить его удаление; в противном случае он удалит его без запроса. Использование флага «-i», чтобы заставить rm запрашивать подтверждение перед удалением файла:

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

Использование флага -f для удаления файлов, защищенных от записи, без запроса разъяснений.

3. Можно удалить несколько файлов:

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

Регулярные выражения также поддерживаются rm. Если вы хотите удалить все файлы с именем имя-файла-*, введите:

Регулярные выражения также можно использовать для определения разных каталогов. Мы можем использовать что-то вроде удаления трех файлов, соответствующих имени файла-1, имени файла-2 и имени файла-3.

4. Удалить архив:

Команду rm с флагом -d можно использовать для удаления пустого каталога.

Поддерживаемые параметры удаления файла также можно комбинировать с удалением каталога с помощью флага -d.

Использование флага -r для удаления непустого каталога.

Если вам не нужен запрос перед удалением каталога и его содержимого, используйте флаг -rf. Это удалит все внутри каталога, включая сам каталог, без какого-либо подтверждения. Будьте осторожны, особенно при использовании в качестве root.

5. Найдите и удалите файлы:

Мы можем использовать команду locate с различными вариантами для более сложных спецификаций. Чтобы удалить все файлы по указанному пути, следуйте шаблону .

Пример:

Мы можем немного изменить приведенную выше команду, чтобы удалить все, что соответствует последовательности >, включая каталоги внутри:

Внутри современные реализации команды find поддерживают функцию удаления. Флаг -delete используется для переопределения инструкции rm, а флаг –depth указывает find обрабатывать содержимое каталога перед самим каталогом:

6. Пустые файлы должны быть найдены и удалены:

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

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

7. Разрешения используются для поиска и удаления файлов:

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

Рассмотрите следующий сценарий:

Простые команды (unlink), (rm) и (rmdir) доступны в Linux, и их можно быстро расширить с помощью регулярных выражений. Для более специализированных потребностей вы должны использовать различные методы, такие как (найти), для достижения ваших целей. Помимо примеров в этом посте, вы можете настроить свой квест, используя поиск с любым из доступных флагов.

Часто запускайте команды find без флагов rm или -delete и проверяйте вывод, чтобы определить, какие файлы или папки могут быть затронуты выполнением программы. Настройка и процедура резервного копирования полезны не только в случае непреднамеренного удаления, но и в случае аппаратных ошибок и кибератак.

Автор Rahul, 5 августа 2013 г. Чтение: 3 минуты Обновлено: 7 апреля 2021 г.

Рекомендуется удалять с сервера старые неиспользуемые файлы. Например, если мы выполняем ежедневное/ежечасное резервное копирование файлов или базы данных на сервере, то на сервере будет создаваться много мусора. Так что чистите его регулярно. Для этого вы можете найти старые файлы в каталоге резервных копий и очистить их.

В этой статье рассказывается, как найти и удалить файлы старше 30 дней. Здесь 30 дней старше означает, что дата последнего изменения предшествует 30 дням.

1. Удалить файлы старше 30 дней

Вы можете использовать команду find для поиска всех файлов, измененных старше X дней. А также удалить их, если требуется, в одной команде.

Во-первых, перечислите все файлы старше 30 дней в каталоге /opt/backup.

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

2. Удалить файлы с определенным расширением

Вместо удаления всех файлов вы также можете добавить дополнительные фильтры для команды поиска. Например, вам нужно удалить только файлы с расширением «.log» и измененные до 30 дней.

В целях безопасности сначала выполните пробный запуск и перечислите файлы, соответствующие критериям.

После проверки списка удалите эти файлы, выполнив следующую команду:

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

3. Рекурсивно удалить старый каталог

Использование параметра -delete может завершиться ошибкой, если каталог не пуст. В этом случае мы будем использовать команду Linux rm с командой find.

Приведенная ниже команда будет искать все каталоги, измененные до 90 дней, в каталоге /var/log.

Здесь мы можем выполнить команду rm, используя параметр командной строки -exec. Выходные данные команды Find будут отправлены в команду rm в качестве входных данных.

ВНИМАНИЕ: Перед удалением каталога убедитесь, что не удаляется полезный каталог. Иногда дата изменения родительского каталога может быть старше, чем у дочерних каталогов. В этом случае рекурсивное удаление также может удалить дочерний каталог.

Заключение

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

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