У нас есть проблема с папкой, которая становится громоздкой с сотнями тысяч крошечных файлов.
Есть так много файлов, что выполнение rm -rf
возвращает ошибку, и вместо этого нам нужно сделать что-то вроде:
find /path/to/folder -name "filenamestart*" -type f -exec rm -f {} \;
Это работает, но очень медленно и постоянно не хватает памяти.
Есть лучший способ сделать это? В идеале я хотел бы удалить весь каталог, не заботясь о содержимом внутри него.
linux
command-line
files
rm
Тоби
источник
источник
rm -rf *
в папке, вероятно, происходит сбой из-за слишком большого количества аргументов; но чтоrm -rf folder/
если вы все равно хотите удалить весь каталог?rm -rf
?fsck
на ней, чтобы освободить неиспользуемые блоки диска, но такой подход кажется рискованным и, возможно, не будет быстрее. Кроме того, проверка файловой системы может в любом случае включать рекурсивный обход дерева файловой системы.ccache
такое огромное файловое дерево, и оноrm
заняло так много времени (и замедлило всю систему), стало намного быстрее копировать все другие файлы из файловой системы, форматировать и копировать их обратно. С тех пор я даю таким огромным небольшим файловым деревьям их собственную выделенную файловую систему, так что вы можетеmkfs
напрямую вместоrm
.Ответы:
Использование rsync удивительно быстро и просто.
В ответе @ sarath упоминается еще один быстрый выбор: Perl! Его тесты быстрее, чем
rsync -a --delete
.Источники:
источник
rsync
может быть быстрее, чем обычныйrm
, потому что он гарантирует удаление в правильном порядке, поэтому требуется меньше пересчетов btress. Посмотрите этот ответ serverfault.com/a/328305/105902-P
возможность Rsync еще некоторое дисплея, а также, быть осторожными о синтаксисе, то замыкающие косые являются обязательными. Наконец, вы можете запустить команду rsync в первый раз с-n
опцией сначала запустить пробный запуск .-a
равняется-rlptgoD
, но для удаления-rd
нужно толькоКто-то в Twitter предложил использовать
-delete
вместо-exec rm -f{} \;
Это повысило эффективность команды, хотя она все еще использует рекурсию для прохождения всего.
источник
find
есть-delete
и другие,find
может быть.-delete
всегда следует отдавать предпочтение,-exec rm
когда это возможно, по соображениям безопасности и эффективности.Как насчет чего-то вроде:
find /path/to/folder -name "filenamestart*" -type f -print0 | xargs -0rn 20 rm -f
Вы можете ограничить количество удаляемых файлов одновременно, изменив аргумент для параметра
-n
. Имена файлов с пробелами также включены.источник
-n 20
бит, так как xargs все равно должен ограничивать себя приемлемыми размерами списка аргументов.man xargs
:(...) max-chars characters per command line (...). The largest allowed value is system-dependent, and is calculated as the argument length limit for exec
. Так что-n
опция предназначена для тех случаев, когда xargs не может определить размер буфера CLI или если у исполняемой команды есть некоторые ограничения.Расширяя один из комментариев, я не думаю, что вы делаете то, что, как вы думаете, вы делаете.
Сначала я создал огромное количество файлов, чтобы смоделировать вашу ситуацию:
Затем я попробовал то, что я ожидал потерпеть неудачу, и как это звучит, как вы делаете в вопросе:
Но это делает работу:
источник
rm -Rf bigdirectory
несколько раз. У меня был каталог с тысячами миллионов подкаталогов и файлов. Я даже не мог запуститьls
илиfind
илиrsync
в этом каталоге, потому что он исчерпал память. Командаrm -Rf
выходила много раз (из памяти), удаляя только часть миллиардов файлов. Но после многих попыток он, наконец, сделал свою работу. Кажется, это единственное решение, если проблема заключается в нехватке памяти.Умный трюк:
Это супер интенсивно использует процессор, но действительно очень быстро. См. Https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html.
источник
rsync -a --delete
против 43 дляlsdent
. Отношение 10x было дляtime ls -1 | wc -l
противtime ./dentls bigfolder >out.txt
(это частично справедливое сравнение из-за> file
противwc -l
).У меня была возможность проверить,
-delete
по сравнению с-exec rm \{\} \;
и для меня-delete
был ответ на эту проблему.Использование
-delete
удаленных файлов в папке из 400 000 файлов как минимум в 1000 раз быстрее, чемrm
.Статья «Как удалить большое количество файлов в Linux» предполагает, что это примерно в три раза быстрее, но в моем тесте разница была гораздо более существенной.
источник
find -exec
выполняетrm
команду для каждого файла отдельно, поэтому она такая медленная.О
-delete
параметре выше: я использую его для удаления большого количества файлов (1M + est) во временной папке, которую я создал и случайно забыл очистить ночью. Я случайно заполнил свой диск / раздел, и ничто иное не могло удалить их, кромеfind .
команды. Это медленно, сначала я использовал:Но это заняло ЧРЕЗВЫЧАЙНОЕ количество времени. Примерно через 15 минут он начал удалять некоторые файлы, но я предполагаю, что он удалял менее 10 или около того в секунду после того, как он наконец запустился. Итак, я попробовал:
вместо этого, и я позволю этому бежать прямо сейчас. Кажется, он работает быстрее, хотя это ЧРЕЗВЫЧАЙНО увеличивает нагрузку на ЦП, чего не было у другой команды. Он работает уже около часа, и я думаю, что я снова получаю место на моем диске, и раздел постепенно «уменьшается», но это все еще занимает очень много времени. Я серьезно сомневаюсь, что он работает в 1000 раз быстрее, чем другие. Как и во всем, я просто хотел указать на компромисс между пространством и временем. Если у вас есть запасная пропускная способность ЦП (у нас есть), запустите последний. Мой процессор работает (
uptime
сообщает):И я видел, что средняя нагрузка превышает 30,00, что не хорошо для загруженной системы, но для нашей, которая обычно слегка загружена, это нормально в течение пары часов. Я проверил большинство других вещей в системе, и они все еще отзывчивы, так что пока все в порядке.
источник
exec
вы почти наверняка захотите не использовать,-ls
а dofind . -type f -exec rm '{}' +
+ быстрее, потому что он даст rm столько аргументов, сколько он может обработать одновременно.find … -delete
через этоnice
илиionice
, это может помочь. Так что может изменить некоторые параметры монтирования на менее безопасные настройки. (И, конечно, в зависимости от того, что еще находится в файловой системе, самый быстрый способ удаления всего частоmkfs
.)1
для одноядерного компьютера - это то же самое, что и loadavg64
для 64-ядерного компьютера. Это означает, что каждый процессор занят 100% времениЕсть несколько методов, которые можно использовать для удаления большого количества файлов в Linux. Вы можете использовать команду find with delete, которая работает быстрее, чем опция exec. Тогда вы можете использовать perl unlink, затем даже rsync. Как удалить большое количество файлов в Linux
источник
Подумайте об использовании тома Btrfs и просто удалите весь том для такого каталога с большим количеством файлов.
В качестве альтернативы вы можете создать файл образа FS, затем размонтировать и удалить его, чтобы действительно быстро все удалить.
источник
Предполагая, что GNU
parallel
установлен, я использовал это:parallel rm -rf dir/{} ::: `ls -f dir/`
и это было достаточно быстро.
источник
Используйте
rm -rf directory
вместоrm -rf *
.Первоначально мы делали,
rm -rf *
находясь в каталоге, чтобы очистить содержимое и думали, что это было настолько быстро, насколько это возможно. Но затем один из наших старших инженеров предложил нам избегать использования звездочек (*
) и вместо этого передавать в родительский каталог, напримерrm -rf directory
.После некоторых серьезных дискуссий о том, как это не будет иметь значения, мы решили сравнить его с третьим методом использования
find
. Вот результаты:rm -rf directory
примерно в 9 раз быстрее, чемrm -rf *
!Само собой разумеется, мы купили тому инженеру пиво!
Так что теперь мы используем,
rm -rf directory; mkdir directory
чтобы удалить каталог и заново создать его.источник
Как я узнал на этом сайте , для удаления каталогов REALLY LARGE необходим другой подход - вам нужно будет использовать ionice.It гарантирует (с -c3), что удаление будет выполняться только тогда, когда у системы есть время IO для этого. Нагрузка на ваши системы не возрастет до высокого уровня, и все останется отзывчивым (хотя время, затрачиваемое на поиск процессора, было довольно высоким - около 50%)
источник
+
вместо\;
сделало бы это быстрее, так как он передает больше аргументов rm одновременно, меньше разветвляетсяionice -c3 find <dir> -type f -delete
Если у вас есть миллионы файлов, и каждое из вышеперечисленных решений подвергает вашу систему стрессу, вы можете попробовать это вдохновение:
Файл
nice_delete
:А теперь удалите файлы:
Find создаст пакеты (см.
getconf ARG_MAX
) Из нескольких десятков тысяч файлов и передаст ихnice_delete
. Это создаст еще меньшие партии, чтобы позволить спать, когда обнаружена перегрузка.источник
должен работать внутри главной папки
источник
ls
не будет работать из-за количества файлов в папке. Вот почему я должен был использоватьfind
, хотя спасибо.ls -f
, что отключает сортировку. Сортировка требует, чтобы весь каталог был загружен в память для сортировки. Несортированныйls
должен иметь возможность передавать свои выходные данные.find . -print0 | xargs -0 rm
, которые будут использовать NULL char в качестве разделителя имени файла.Для подсказки Изкаты выше:
Это почти сработало - или сработало бы - но у меня были некоторые проблемы с разрешением; файлы были на сервере, но я все еще не понимаю, откуда возникла проблема с разрешениями. В любом случае, Терминал запросил подтверждение для каждого файла. Количество файлов было около 20 000, так что это не вариант. После «-r» я добавил опцию «-f», поэтому вся команда была « rm -r -f foldername / ». Тогда это, казалось, работало нормально. Я новичок в Терминале, но я думаю, что все в порядке, верно? Спасибо!
источник
В зависимости от того, насколько хорошо вам нужно избавиться от этих файлов, я бы предложил использовать
shred
.Если вы хотите очистить каталог, но не можете удалить его и воссоздать, я советую переместить и воссоздать его немедленно.
это быстрее, хотите верьте, хотите нет, так как нужно изменить только один инод. Помните: вы не можете распараллелить этот тест на многоядерном компьютере. Это сводится к доступу к диску, который ограничен RAID или что у вас есть.
источник
shred
не будет работать со многими современными файловыми системами.Если вы просто хотите избавиться от множества файлов как можно быстрее, это
ls -f1 /path/to/folder/with/many/files/ | xargs rm
может сработать, но лучше не запускать его на производственных системах, поскольку ваша система может стать причиной проблем с вводом-выводом, а приложения могут застрять во время операции удаления.Этот скрипт прекрасно работает для многих файлов и не должен влиять на загрузку системы.
источник