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

У меня есть каталог, в котором очень много файлов кэшируется. Так как это очень маленькие файлы, он очень быстро потребляет все мои 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 

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

  • Найти и удалить подкаталоги без ошибок?
  • удалять несколько удаленных файлов с помощью команды FTP
  • rm -fr не удаляет каталог из-за ошибки «Is directory»
  • Когда мы делаем rm -rf *, почему мы не удаляем. а также ..?
  • удалить вложенные папки и файлы, не удаляя родительскую папку и дочернюю папку?
  • Почему OS X не позволяет мне переименовать файл?
  • Разрешения на удаление всех файлов в подкаталоге
  • Найти и заменить все те же файлы между 2 каталогами
  • find и rm -rf, почему он печатает ошибки?
  • Как мне передать ls в grep и удалить файлы, отфильтрованные grep?
  • Минимальные права доступа к файлу для удаления файла
  • Interesting Posts

    Бареос: один пул с различными типами носителей

    Разбор XML-файла XML-файла

    apt-get install не устанавливает последнюю версию Owncloud Client

    Можно ли изменить анимацию окна по умолчанию в Gnome Shell (желательно для постепенного уменьшения / уменьшения)?

    Правила брандмауэра IPv6, похоже, препятствуют всем подключениям

    Какой драйвер используется беспроводным адаптером USB?

    Как изменить приоритет PATH для указанной команды в zsh

    Блок Fail2ban с IPtables не работает на Debian Lenny.

    Почему VBoxManage не загружается с DVD?

    losetup: невозможно найти неиспользуемое устройство цикла

    Проблема с использованием ecryptfs, когда / home смонтирована в двух разных системах

    Как установить Ruby GEM_HOME и GEM_PATH

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

    bash для чтения первого аргумента в качестве входного файла и поиска переменной в другом файле по строкам

    Удаление числовых значений в определенных столбцах при сохранении минус-знаков?

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