Более быстрый способ удаления большого количества файлов

У меня есть каталог, в котором очень много файлов кэшируется. Так как это очень маленькие файлы, он очень быстро потребляет все мои inodes.

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

$ find ./cache -mtime +0.5 -exec rm {} \; 

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

8 Solutions collect form web for “Более быстрый способ удаления большого количества файлов”

Попробуйте использовать xargs :

 find ./cache -mtime +0.5 -print0 | xargs -0 rm -f 

Обновление объяснения для @pradeepchhetri

Если вы используете find с -exec , каждый найденный файл будет называть rm один раз. Итак, если вы обнаружили огромное количество файлов, то есть 10000 файлов, вы вызывали rm 10000 раз.

xargs будет обрабатывать xargs find качестве аргумента команды в rm , так что xargs будет предоставлять столько аргументов, сколько может обрабатывать rm -f file1 file2 ... , т. е. rm -f file1 file2 ... Таким образом, он делает меньше вызовов fork, заставляя программу работать быстрее.

find … -exec rm {} \; выполняет команду rm для каждого файла. Хотя запуск нового процесса довольно быстрый, он все еще намного медленнее, чем простой акт удаления файла.

find … -exec rm {} + будет вызывать rm в партиях, что намного быстрее: вы платите стоимость запуска rm один раз за партию, и каждая партия выполняет много удалений.

Еще быстрее не вызывать rm вообще. Команда find в Linux имеет действие -delete для удаления соответствующего файла.

 find ./cache -mtime +0.5 -delete 

Однако, если вы создаете файлы с такой скоростью, чтобы find … -exec rm {} \; не может идти в ногу, возможно, что-то не так с вашей настройкой. Если cache содержит миллионы файлов, вы должны разделить его на подкаталоги для более быстрого доступа.

Хотя find – лучший (самый простой, идиоматический) подход,

 find $dir -exec rm {} + 

Вы можете переместить каталог в сторону, создать новый каталог (для своей программы), а затем удалить …

 mv $idr old$dir && mkdir $dir && rm -rf old$dir 

но, возможно, ваша проблема заключается в создании слишком большого количества файлов. Почему бы не изменить вашу программу на добавление к существующему файлу, а не создавать новый файл? И тогда вы можете переместить этот файл (logfile) в сторону, а затем ваша программа может создать / добавить к новому файлу, например,

 fd = open("logfile","a+"); 

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

 mv cache foobar mkdir cache # may require app restart rm -rf foobar 

Если вы просто хотите как можно скорее избавиться от многих файлов ls -f1 /path/to/folder/with/many/files/ | xargs rm ls -f1 /path/to/folder/with/many/files/ | xargs rm может работать нормально, но лучше не запускать его на производственных системах, если вы не хотите, чтобы это повлияло на обслуживание.

Этот скрипт прекрасно работает для многих файлов и не должен влиять на ioload системы.

 #!/bin/bash # Path to folder with many files FOLDER="/path/to/folder/with/many/files" # Temporary file to store file names FILE_FILENAMES="/tmp/filenames" if [ -z "$FOLDER" ]; then echo "Prevented you from deleting everything! Correct your FOLDER variable!" exit 1 fi while true; do FILES=$(ls -f1 $FOLDER | wc -l) if [ "$FILES" -gt 10000 ]; then printf "[%s] %s files found. going on with removing\n" "$(date)" "$FILES" # Create new list of files ls -f1 $FOLDER | head -n 5002 | tail -n 5000 > "$FILE_FILENAMES" if [ -s $FILE_FILENAMES ]; then while read FILE; do rm "$FOLDER/$FILE" sleep 0.005 done < "$FILE_FILENAMES" fi else printf "[%s] script has finished, almost all files have been deleted" "$(date)" break fi sleep 5 done 

rm -rf directory / также работает быстрее для миллиарда файлов в одной папке. Я попробовал это.

Еще одним конкретным решением Linux будет использование возможностей inotify (7) ; вы обнаружите, когда файлы будут добавлены, а затем вы сразу же запустите что-то, чтобы удалить старые.

OTOH, я предполагаю, что у вас может возникнуть проблема с XY . Почему у вас так много новых файлов? Возможно, использование sqlite или индексированных файлов GDBM или некоторой реальной базы данных (например, PostGresQL, MariaDB, MongoDB) может быть лучше … Возможно, вам нужна какая-то система контроля версий, например git ?

 find . -name -mtime +0.5 -print -delete 

это еще один способ быстро удалить большое количество файлов.

  • Не удается (принудительно) удалить каталог в сборке Docker
  • почему я могу удалить файл, принадлежащий `root` под пользователем без полномочий root?
  • Поиск и удаление файлов с определенной датой
  • Почему мой цикл inotifywait завершается после удаления некоторых подкаталогов?
  • Как поставить «rm -i» на итерации?
  • Как удалить 2 месяца назад файлы в unix
  • Как процитировать аргументы с помощью xargs
  • mv-файл без права на запись в исходный файл
  • Массовое удаление большого каталога на ZFS без его рекурсивного перемещения
  • Почему «rm *» не работает, когда есть файлы, начинающиеся с дефиса?
  • Удалить файлы, более новые, чем X день и час
  • Interesting Posts

    Исходный код драйвера ATA_PIIX

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

    Применить «обновить» определенные пакеты с помощью apt

    Vim: В чем разница между дробовыми метками движения. и "?"?

    Как подключить последовательный терминал к экземпляру KVM?

    Wi-Fi работает после запуска Live Cd

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

    Raspbian / Debian Jessie: обновление ядра в автономном режиме

    монтаж изображений раздела, сделанных с помощью dd

    Как установить некоторые пакеты из «нестабильного» Debian на компьютере под управлением «стабильного» Debian?

    Существуют ли какие-либо команды, которые позволят мне скопировать последнюю строку предыдущего вывода в буфер обмена?

    Chrome игнорирует инвертированную прокрутку

    Почему SIGINT не работает в фоновом режиме в скрипте?

    Предотвращение apt-get обновления от использования определенных репозиториев

    Как работают котировки Slackware Login?

    Linux и Unix - лучшая ОС в мире.