Como remover o diretório no sistema de arquivos NFS com um número enorme de arquivos

5

Um programa mal testado criou um diretório em um compartilhamento NFS com um número enorme de arquivos, que eu preciso remover.

ls -ald /home/foo
drwxrwxr-x 2 503 503 317582336 Jul 29 11:38 /home/foo

O diretório está localizado em uma montagem NFS de aproximadamente 600 GB em um dispositivo do tipo netapp. Eu realmente não tenho idéia de quantos arquivos existem, mas um diretório semelhante criado depois de apenas 10 minutos tem 121.000 arquivos, então provavelmente está em milhões em algum lugar. SO é o kernel do Linux 2.6.

Tentando encontrar uma maneira de listar ou removê-lo e seu conteúdo. encontrar / home / foo resulta em morrer após cerca de 1 hora, sem saída diferente de "./"

    
por Jenny D 11.08.2010 / 15:06

5 respostas

5

(respondendo minha própria pergunta no caso de alguém encontrá-lo enquanto procura por semelhante.) Existem possivelmente até 9 milhões de arquivos no diretório.

Infelizmente, não é possível fazer login no servidor diretamente, é um appliance. O único acesso aos sistemas de arquivos é via exportação.

rm -rf não parece funcionar. observando com strace estava pendurado.

ache que não foi completo, morreu sem erro.

ls -1 nunca pareceu completar. (Eu percebo agora que ele tenta classificar os resultados, ls-1f pode ter funcionado eventualmente).

o que funcionou foi um simples snippet perl. Eu suponho que o código c funcionaria da mesma forma.

 opendir( my $dh,  '/home/foo' ) or die $!
    while ( my $file = readdir $dh ) {
        print "$file\n";
    }
    
por 11.08.2010 / 19:58
3

Sugiro que você NÃO tente remover esses arquivos pelo NFS - Efetue login no servidor de arquivos diretamente e exclua os arquivos lá. Isso será substancialmente menos abusivo para o servidor NFS (e para o cliente).

Além disso, use find (como descrito por MattBianco) ou use ls -1 | xargs rm -f (dentro desse diretório) se o find tiver problemas para concluir (o último deve funcionar bem com o NFS, embora eu recomende fazê-lo localmente).

    
por 11.08.2010 / 16:48
2

Esse segmento bastante antigo surgiu para mim no Google, então gostaria de compartilhar algumas estatísticas.

Aqui está uma comparação de três métodos diferentes para remover arquivos em um servidor NFS:

  1. plain rm : rm dir/*
  2. encontrar : find dir/ -type f -exec rm {} \;
  3. rsync : tempdir=$( mktemp -d ); \ rsync -a --delete $tempdir/ dir/; \ rmdir $tempdir

Para comparar esses métodos, criei 10000 arquivos sempre que fiz um teste com

for i in {1..10000} ; do touch $i ; done

Os resultados na plotagem mostram que o rsync é muito mais rápido e é o mais lento dos três métodos

Osresultadospermanecemquandoonúmerodearquivosédobrado(eunãoexecuteifindem20000arquivos),amédiadetempofoide3execuçõespara10.000arquivose2execuçõespara20000arquivos.

1000020000find28.3-rm12.923.9rsync6.9412.2

Éinteressanteverdequemaisdependeodesempenhodessesmétodos.

Uma postagem relacionada neste site discute a exclusão de um grande número de arquivos em um sistema de arquivos ext3.

    
por 02.10.2017 / 16:46
0

Talvez find /home/foo -mount -depth -type f -exec rm -f {} \; possa ser útil.
-exec torna find executar um comando (terminado pelo ponto e vírgula: \; ), com as chaves {} sendo substituídas pelo nome do caminho do arquivo.
Isso significa um processo rm para cada arquivo a ser removido.
-type f apenas o faz para arquivos, caso você tenha uma estrutura de diretórios em / home / foo, os diretórios permanecerão. Apenas arquivos serão removidos.

    
por 11.08.2010 / 15:57
0

Isso parece um pouco óbvio, mas você já tentou:

rm -rf /home/foo/

Caso contrário, existe uma maneira de usar um regex para obter um subconjunto pequeno o suficiente para entregar a |xargs rm ?

Se ls falhar, você pode tentar echo /home/foo/* | xargs rm , embora isso possa falhar com 'linha muito longa' ou algo semelhante. Ah, e eu segundo a recomendação para tentar fazer isso diretamente no servidor, em vez de sobre o NFS.

    
por 11.08.2010 / 16:52

Tags