
Плохо протестированная программа создала на общем ресурсе 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 час, не выдавая ничего, кроме "./".
решение1
(отвечаю на свой собственный вопрос, на случай, если кто-то найдет его, когда будет искать что-то похожее.) В каталоге, возможно, находится около 9 миллионов файлов.
К сожалению, напрямую на сервер зайти нельзя, это устройство. Доступ к файловым системам возможен только через экспорт.
rm -rf, похоже, не работает. Наблюдал с помощью strace, он завис.
поиск не был завершен, завершился без ошибок.
ls -1, похоже, так и не завершился. (Теперь я понимаю, что он пытается отсортировать результаты, ls -1f в конечном итоге мог бы сработать).
то, что сработало, было простым фрагментом perl. Я предполагаю, что код на c сделает то же самое, что и я.
opendir( my $dh, '/home/foo' ) or die $!
while ( my $file = readdir $dh ) {
print "$file\n";
}
решение2
Эта довольно старая тема попалась мне на глаза в Google, поэтому я хотел бы поделиться некоторой статистикой.
Ниже приведено сравнение трех различных методов удаления файлов на сервере NFS:
- простой rm:
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 — самый медленный из трех методов.
Результаты сохраняются при удвоении количества файлов (я не запускал find
20000 файлов), время усреднено по 3 запускам для 10000 файлов и 2 запускам для 20000 файлов.
10000 20000
find 28.3 -
rm 12.9 23.9
rsync 6.94 12.2
Интересно посмотреть, от чего еще зависит эффективность этих методов.
Связанныйпочтана этом сайте обсуждается удаление большого количества файлов в файловой системе ext3.
решение3
Я бы посоветовал вам НЕ пытаться удалить эти файлы через NFS -- войдите на файловый сервер напрямую и удалите файлы там. Это будет значительно менее оскорбительно для сервера NFS (и клиента).
Помимо этого, используйте find (как описано MattBianco) или use ls -1 | xargs rm -f
(из этого каталога), если при выполнении find возникают проблемы (последний вариант должен нормально работать через NFS, хотя я бы рекомендовал делать это локально).
решение4
Это кажется немного очевидным, но пробовали ли вы:
rm -rf /home/foo/
? Если это невозможно, есть ли способ использовать регулярное выражение, чтобы получить достаточно небольшое подмножество для передачи |xargs rm
?
Если ls не работает, вы можете попробовать echo /home/foo/* | xargs rm
, хотя это может просто выдать ошибку «строка слишком длинная» или что-то в этом роде. О, и я поддерживаю рекомендацию попробовать сделать это напрямую на сервере, а не через NFS.