Плохо протестированная программа создала каталог в общей папке 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 час без вывода, кроме "./"
(отвечая на мой собственный вопрос на случай, если кто-то найдет его при поиске аналогичного.) В каталоге может быть до 9 миллионов файлов.
К сожалению, невозможно войти на сервер напрямую, это устройство. Единственный доступ к файловым системам - это экспорт.
rm -rf, похоже, не работает. наблюдая с пристальным вниманием, он висел.
найти не завершено, умер без ошибок.
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 {} \;
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.
Я бы посоветовал вам НЕ пытаться удалить эти файлы через NFS - войдите на файловый сервер напрямую и удалите файлы там. Это будет значительно менее оскорбительным для сервера NFS (и клиента).
Помимо этого, используйте find (как описано MattBianco) или используйте ls -1 | xargs rm -f
(из этого каталога), если у find возникают проблемы с завершением (последний должен нормально работать через 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
хотя это может просто потерпеть неудачу с «слишком длинной строкой» и т.п. Да, и я второй советую попробовать сделать это прямо на сервере, а не через NFS.