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

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

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

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

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

11
21.10.2013, 11:48
4 ответа

Попытайтесь использовать xargs:

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

Обновите explaination для @pradeepchhetri

Если Вы используете find с -exec, каждый файл это find найденный будет звонить rm одно время. Таким образом, при нахождении огромного из файлов, т.е. 10 000 файлов Вы звонили rm 10000 раз.

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

17
27.01.2020, 19:56
  • 1
    Можете Вы объяснять меня, почему это выполняет быстрее команду, которую я упомянул. Я заметил, что это работает быстрее. –  pradeepchhetri 21.10.2013, 12:34
  • 2
    @pradeepchhetri С Вашим методом, find запускает новое rm процесс для каждого файла, который соответствует критериям. С методом Gnouc, xargs запускает только один экземпляр для rm для набора файлов. Запуск многих меньшего количества программ делает его быстрее. –  kurtm 21.10.2013, 14:31
  • 3
    @kurtm редактирования: Спасибо за объяснение. Но я видел замечательное различие между двумя командами, количество ветвления () syscalls, единственная разница между двумя? –  pradeepchhetri 21.10.2013, 15:06
  • 4
    @pradeepchhetri Да, который является единственной разницей, количеством rm процессы порождены. –  kurtm 21.10.2013, 16:34
  • 5
    , если Вы используете, находит с \+ вместо \; это укутается должностные лица и только запустит должностное лицо, когда командная строка станет "большой" –  kdubs 17.02.2017, 20:31

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

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

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

find ./cache -mtime +0.5 -delete

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

23
27.01.2020, 19:56
  • 1
    Почти 7 миллионов очень маленьких файлов арендного договора DHCP использовали весь inodes. find -delete спасенный положение; удаленный приблизительно 6,5 миллионов файлов в то же время, поскольку комната взяла для удаления приблизительно 20 тысяч. –  studog 27.02.2018, 20:50

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

mv cache foobar
mkdir cache
# may require app restart
rm -rf foobar
2
27.01.2020, 19:56

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

find $dir -exec rm {} +

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

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

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

fd = open("logfile","a+");
1
27.01.2020, 19:56

Теги

Похожие вопросы