Excluindo bilhões de arquivos de um diretório e vendo o progresso também


36

Eu tenho um diretório de 30 TB com bilhões de arquivos, formalmente todos os arquivos JPEG. Estou excluindo cada pasta de arquivos como esta:

sudo rm -rf bolands-mills-mhcptz

Este comando é executado e não mostra nada, esteja funcionando ou não.

Eu quero ver como está excluindo arquivos ou qual é o status atual do comando.


19
Não respostas: às vezes é mais rápido fazer o backup do material que você deseja manter, formatar e restaurar o material que deseja manter. Outras respostas: unix.stackexchange.com/questions/37329/...
Eric Torres

2
Se você quiser apenas uma idéia do progresso, em vez de saber quais arquivos específicos foram removidos, execute "df / dev / sd_whatever_the_drive_is".
Jamesqf

11
Como você acabou com bilhões de arquivos em um único diretório?
Lightness Races com Monica

1
@MichaelHampton Mas se os arquivos não forem um conjunto de dados separado, poderá demorar muito tempo. (no ZFS) serverfault.com/questions/801074/…
v7d8dpo4

5
Bilhões de arquivos, hein? Tente rm -ri. Será divertido!
precisa saber é o seguinte

Respostas:


98

Você pode usar rm -vpara ter rmimprimir uma linha por arquivo excluído. Dessa forma, você pode ver que rmrealmente está trabalhando para excluir arquivos. Mas se você tiver bilhões de arquivos, tudo o que verá é que rmainda está funcionando. Você não terá idéia de quantos arquivos já foram excluídos e quantos restam.

A ferramenta pvpode ajudá-lo com uma estimativa de progresso.

http://www.ivarch.com/programs/pv.shtml

Aqui está como você iria invocar rmcom pvcom o exemplo de saída

$ rm -rv dirname | pv -l -s 1000 > logfile
562  0:00:07 [79,8 /s] [====================>                 ] 56% ETA 0:00:05

Neste exemplo, eu disse pvque existem 1000arquivos. A saída de pvmostra que 562 já foram excluídos, o tempo decorrido é de 7 segundos e a estimativa a ser concluída é de 5 segundos.

Alguma explicação:

  • pv -lfaz pvcontar por novas linhas em vez de bytes
  • pv -s numberinforma pvqual é o total para que você possa fazer uma estimativa.
  • O redirecionamento para logfileno final é para saída limpa. Caso contrário, a linha de status de pvserá confundida com a saída de rm -v. Bônus: você terá um arquivo de log do que foi excluído. Mas cuidado, o arquivo ficará enorme. Você também pode redirecionar para /dev/nullse não precisar de um log.

Para obter o número de arquivos, você pode usar este comando:

$ find dirname | wc -l

Isso também pode levar um longo tempo se houver bilhões de arquivos. Você pode usar pvaqui também para ver o quanto isso contou

$ find dirname | pv -l | wc -l
278k 0:00:04 [56,8k/s] [     <=>                                              ]
278044

Aqui diz que levou 4 segundos para contar 278k arquivos. A contagem exata no final ( 278044) é a saída de wc -l.

Se você não quiser esperar a contagem, poderá adivinhar o número de arquivos ou usar pvsem estimativa:

$ rm -rv dirname | pv -l > logfile

Assim, você não terá nenhuma estimativa para concluir, mas pelo menos verá quantos arquivos já foram excluídos. Redirecione para /dev/nullse você não precisar do arquivo de log.


Nitpick:

  • você realmente precisa sudo?
  • geralmente rm -ré suficiente para excluir recursivamente. não precisa rm -f.

5
Bom uso pv, supondo que não seja muito caro contar os bilhões de arquivos ;-). (Pode demorar quase tanto tempo como o rmque é suposto medir!)
Stephen Kitt

7
@StephenKitt Isso é o que realmente me incomoda (e muitas outras pessoas) sobre o utilitário de arquivos do Windows: ele sempre conta , sem falhas, o número e o tamanho dos arquivos antes de excluir o que, a menos que a unidade seja muito mais lenta que o processador, leva quase o mesmo enquanto a exclusão real!
precisa saber é o seguinte

@ wizzwizz4 De fato! Há mais do que isso no IIRC - ele verifica se pode excluir tudo antes de excluir qualquer coisa , para aumentar as chances de exclusões serem "tudo ou nada". Muitos anos atrás, eu escrevi um driver de sistema de arquivos para o Windows, havia algumas curiosidades com as quais tínhamos que lidar, incluindo algumas relacionadas à maneira como o Explorer exclui, mas não me lembro dos detalhes. (Eu me lembro que a criação de uma pasta envolve escrever e apagar um arquivo na nova pasta!)
Stephen Kitt

7
@StephenKitt Talvez eu esteja enganado, mas não é o gargalo, além do acesso ao disco, a saída do terminal? Acredito que pvatualiza a barra de progresso apenas uma vez por segundo, apesar de sua entrada. Portanto, o terminal precisa exibir apenas uma linha em vez de uma tonelada por segundo. pvsó precisa incrementar um contador para cada nova linha que encontrar; isso precisa ser mais rápido do que fazer quebra automática de linha e outros enfeites para exibir uma linha em um terminal. Eu acho que rodar pvdessa maneira faz com que as remoções de arquivos sejam mais rápidas do que simples rm -rv.
JoL1

1
@skywinderrm -rv dirname | pv -l -s $(find dirname | wc -l) > logfile
lesmana

28

Confira a resposta da lesmana , é muito melhor que a minha - especialmente o último pvexemplo, que não levará muito mais tempo que o silencioso original, rmse você especificar em /dev/nullvez de logfile.

Supondo que seu rmsuporte seja a opção (provavelmente funciona desde que você esteja executando o Linux), você pode executá-lo no modo detalhado com -v:

sudo rm -rfv bolands-mills-mhcptz

Como foi apontado por vários comentadores, isso pode ser muito lento devido à quantidade de saída gerada e exibida pelo terminal. Você poderia redirecionar a saída para um arquivo:

sudo rm -rfv bolands-mills-mhcptz > rm-trace.txt

e observe o tamanho de rm-trace.txt.


5
Isso pode realmente retardar o baixo de exclusão por causa de toda a saída está sendo gerado e entregue a um terminal :)
rackandboneman

2
Claro que vai desacelerar. Gravar bilhões de linhas em um arquivo não acontece em tempo zero.
usar o seguinte comando

23

Outra opção é observar o número de arquivos no sistema de arquivos diminuir. Em outro terminal, execute:

watch  df -ih   pathname

A contagem de inodes usados ​​diminuirá conforme o rmprogresso. (A menos que os arquivos tenham principalmente vários links, por exemplo, se a árvore foi criada com cp -al). Isso rastreia o progresso da exclusão em termos de número de arquivos (e diretórios). dfsem -irastreará em termos de espaço usado.

Você também pode executar iostat -x 4para ver operações de E / S por segundo (assim como kiB / s, mas isso não é muito relevante para E / S de metadados puros).


Se você ficar curioso sobre quais arquivos rmestão trabalhando no momento, você pode anexá strace-lo e ver como as unlink()chamadas do sistema (e getdents) são exibidas no seu terminal. por exemplo sudo strace -p $(pidof rm). Você pode encontrar ^co caminho para desanexar rmsem interrompê-lo.

Eu esqueço se o rm -rdiretório de alterações na árvore está sendo excluído; se assim você poderia olhar /proc/<PID>/cwd. Sua /proc/<PID>/fdforça, muitas vezes têm um diretório fd aberto, para que você possa olhar para isso para ver o que o seu rmprocesso está actualmente a analisar.


2
df -ihé realmente uma maneira barata e agradável de assistir ao rmprogresso.
Stephen Kitt

BTW, isso não funciona no BTRFS, onde a contagem de inodes usados ​​é sempre zero. :( O mesmo para o FAT32, mas você provavelmente não possui bilhões de arquivos na sua /bootpartição do sistema EFI.
Peter Cordes

4

Embora todas as respostas acima sejam úteis rm, rmpode ser bastante lento na exclusão de um grande número de arquivos, como observei recentemente ao extrair ~ 100K arquivos de um arquivo .tar na verdade demorou menos tempo do que excluí-los. Embora isso realmente não responda à pergunta que você fez, uma solução melhor para o seu problema pode ser o uso de um método diferente para excluir seus arquivos, como uma das respostas anteriores a esta pergunta .

Meu método favorito pessoal é usar rsync -a --delete. Eu acho que esse método executa com rapidez suficiente para que valha a facilidade de uso sobre a resposta mais votada para essa pergunta , na qual o autor escreveu um programa em C que você precisaria compilar. (Observe que isso produzirá todos os arquivos que estão sendo processados ​​no stdout, assim como rm -rv; isso pode retardar o processo em uma quantidade surpreendente. Se você não desejar essa saída, use rsync -aq --deleteou redirecione a saída para um arquivo.)

O autor dessa resposta diz:

O programa agora (no meu sistema) excluirá 1000000 arquivos em 43 segundos. O programa mais próximo disso foi o rsync -a --delete, que levou 60 segundos (que também faz exclusões em ordem também, mas não executa uma pesquisa de diretório eficiente).

Eu descobri que isso é bom o suficiente para meus propósitos. Também é potencialmente importante com essa resposta, pelo menos se você estiver usando o ext4:

Como uma previsão, deve-se remover o diretório afetado e refazê-lo depois. Os diretórios apenas aumentam de tamanho e podem permanecer com desempenho fraco, mesmo com alguns arquivos internos devido ao tamanho do diretório.


Eu esperava rme / ou find --deleteser eficiente. Ponto interessante sobre a exclusão na ordem de classificação para evitar reequilíbrios da árvore b durante a exclusão. Não tenho certeza de quanto disso se aplica a outros sistemas de arquivos. O XFS também não é ótimo, com milhões de arquivos por diretório. IDK sobre BTRFS, mas tenho a impressão de que pode ser bom para esse tipo de coisa.
Peter Cordes

Não que segunda citação dependem do tipo de sistema de arquivos ...
Menashe

@Menasheh Bom ponto, eu editei isso na minha resposta.
Hitechcomputergeek

3

Uma coisa que você poderia fazer seria iniciar o rmprocesso em segundo plano (sem saída, para que não seja mais lento) e depois monitorá-lo em primeiro plano com um simples comando (a) :

pax> ( D=/path/to/dir ; rm -rf $D & while true ; do
...>   if [[ -d $D ]] ; then
...>     echo "$(find $D | wc -l) items left"
...>   else
...>     echo "No items left"
...>     break
...>   fi
...>   sleep 5
...> done )

27912 items left
224 items left
No items left

pax> _

O find/wccombo pode ser substituído por qualquer ferramenta capaz de fornecer as unidades que você deseja.


(a) Bem, relativamente simples, comparado com, por exemplo, a física nuclear, a hipótese de Riemann ou o que comprar minha esposa para o Natal :-)


0

Há um tempo atrás escrevi algo para imprimir a taxa em que as linhas foram impressas. Você pode executar rm -rfv | ./countere imprimir linhas por segundo / min. Embora não seja um progresso direto, ele fornecerá algum feedback sobre a taxa de progresso, talvez rmsobre um sistema de arquivos de rede ou similar?

O link para o código está aqui:

http://www.usenix.org.uk/code/counter-0.01.tar.gz

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.