Назад | Перейти на главную страницу

Как удалить каталог в файловой системе 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 час без вывода, кроме "./"

(отвечая на мой собственный вопрос на случай, если кто-то найдет его при поиске аналогичного.) В каталоге может быть до 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:

  1. простой RM: rm dir/*
  2. найти: find dir/ -type f -exec rm {} \;
  3. 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.

Я бы посоветовал вам НЕ пытаться удалить эти файлы через 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.