Как удалить каталог в файловой системе NFS с огромным количеством файлов
Плохо протестированная программа создала каталог на общем ресурсе NFS с огромным количеством файлов, которые мне нужно удалить.
ls -ald /home/foo
drwxrwxr-x 2 503 503 317582336 Jul 29 11:38 /home/foo
Каталог находится на NFS-монтировании размером около 600 ГБ на устройстве типа netapp. На самом деле я понятия не имею, сколько в нем файлов, но аналогичный каталог, созданный всего за 10 минут, содержит 121 000 файлов, так что, вероятно, он где-то исчисляется миллионами. ОС - ядро Linux 2.6.
Попытка найти способ перечислить или удалить его и его содержимое. find /home/foo приводит к тому, что find умирает примерно через 1 час, без вывода, кроме "./"
5 ответов
(отвечая на мой собственный вопрос на случай, если кто-нибудь найдет его во время поиска аналогичного.) Возможно, в каталоге находится до 9 миллионов файлов.
К сожалению, не могу войти на сервер напрямую, это устройство. Единственный доступ к файловым системам - через экспорт.
рм-рф, похоже, не работает. смотреть со стразами это висело.
найти не удалось, умер без ошибок.
ls -1 никогда не заканчивался. (Теперь я понимаю, что он пытается отсортировать результаты, возможно, ls -1f в конечном итоге сработал).
то, что работало, было простым фрагментом perl. Я предполагаю, что код c сделать то же самое будет работать.
opendir( my $dh, '/home/foo' ) or die $!
while ( my $file = readdir $dh ) {
print "$file\n";
}
Эта довольно старая тема появилась в Google, поэтому я хотел бы поделиться статистикой.
Вот сравнение трех разных способов удаления файлов на сервере NFS:
- обычный рм:
rm dir/*
- найти:
find dir/ -type f -exec rm {} \;
- rsync:
tempdir=$( mktemp -d ); \ rsync -a --delete $tempdir/ dir/; \ rmdir $tempdir
Чтобы сравнить эти методы, я создал 10000 файлов каждый раз, когда проводил тест с
for i in {1..10000} ; do touch $i ; done
Результаты на графике показывают, что rsync намного быстрее, и найти самый медленный из трех методов
Результаты остаются, когда количество файлов удваивается (я не запускал find
на 20000 файлов), среднее время более 3 прогонов для 10000 файлов и 2 прогона для 20000 файлов.
10000 20000
find 28.3 -
rm 12.9 23.9
rsync 6.94 12.2
Интересно посмотреть, от чего еще зависит эффективность этих методов.
Соответствующий пост на этом сайте обсуждает удаление большого количества файлов в файловой системе ext3.
Я бы посоветовал вам НЕ пытаться удалить эти файлы через NFS - войдите на файловый сервер напрямую и удалите файлы там. Это будет значительно менее оскорбительным для сервера NFS (и клиента).
Кроме того, используйте find (как описано MattBianco) или используйте ls -1 | xargs rm -f
(из этого каталога), если при поиске возникли проблемы с завершением (последний должен работать нормально по NFS, хотя я бы порекомендовал сделать это локально).
Может быть find /home/foo -mount -depth -type f -exec rm -f {} \;
может быть полезным-exec
марки find
выполнить команду (завершается точкой с запятой: \;
), с брекетами {}
заменяется на путь к файлу.
Это значит один rm
процесс для каждого файла, чтобы удалить.-type f
делает это только для файлов, если у вас есть структура каталогов в / home / foo, каталоги останутся. Будут удалены только файлы.
Это кажется немного очевидным, но вы пробовали:
rm -rf /home/foo/
? В противном случае, есть ли способ использовать регулярное выражение, чтобы получить достаточно маленькое подмножество для передачи |xargs rm
?
Если ls не работает, вы можете попробовать echo /home/foo/* | xargs rm
хотя это может просто потерпеть неудачу с "слишком длинной строкой" или подобным. Да, и я рекомендую попробовать сделать это directkly на сервере, а не через NFS.