Как удалить каталог в файловой системе 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:

  1. обычный рм: 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 на 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.

Другие вопросы по тегам