Use rmdir para excluir muitas pastas vazias dentro de uma pasta

1

Eu tenho uma pasta que deve a qualquer momento ter menos de 500k pastas. Essas pastas são criadas dinamicamente e quando os arquivos (imagens) dentro deles são excluídos por algum script, a própria pasta também deve ser excluída. Devido a um bug, a exclusão das pastas vazias não foi feita, e agora acabamos com milhões de pastas vazias ...

Então, no momento, tenho cerca de 500k pastas com arquivos nelas e, além delas, milhões de pastas vazias.

Porque há tantos dirs lá, até um simples ls | wc -l leva horas, então nem consegue encontrar o número exato.

Eu poderia executar um comando de localização: find. -maxdepth 1 -tipo d-vazio; e depois canalizá-lo com um rmdir; mas, novamente, a descoberta leva tempo (ou até mesmo usa a opção -delete que encontra ofertas)

Eu então tive a idéia de usar rmdir --ignore-fail-on-non-empty / path / para / huge / folder / *; mas não tenho certeza sobre sua eficiência. Basicamente, este comando apenas apaga os diretórios vazios da minha pasta, o que significa que os arquivos que possuem arquivos devem ser seguros e não excluídos. Em seguida, a opção '--ignore-fail-on-non-empty' ignora as centenas de milhares ou avisos para os diretórios que, na verdade, não estão vazios.

Eu criei rapidamente cerca de 100k de pastas vazias no meu local, então 'toquei' alguns arquivos em algumas delas e usei o comando rmdir. Embora tenha levado 2 minutos para criar 100k de pastas vazias, foram necessários 2 segundos (!) Para excluir os vazios. Então, minhas esperanças são altas, mas não tenho certeza de como ele lidará com cerca de 10 milhões de pastas ... (Eu acho que eu poderia usar o ionice para impedir que o sistema fosse bloqueado no caso de realmente demorar)

Se alguém tiver alguma ideia / conselho ou tiver enfrentado algo assim antes, pode indicar-me a melhor forma de abordar o meu problema. Ou até mesmo para me dizer qual caminho é melhor ir: find or rmdir ...

EDITAR: Esqueci de mencionar a estrutura de pastas antes. As pastas dentro da pasta principal que possuem arquivos nelas não têm mais pastas nelas. As outras pastas estão vazias. Assim, todos esses milhões de pastas podem estar vazios ou conter arquivos, mas não mais pastas. Então, basicamente, há apenas um nível de pastas na estrutura da árvore.

    
por Titi 03.01.2014 / 18:43

1 resposta

0

Sem saber quantos diretórios você tem, é difícil prever como se comportará, mas posso dizer o seguinte:

find . -maxdepth 1 -type d -empty -delete

é uma ideia muito ruim. encontrar é terrivelmente lento quando se trata de deletar coisas. Nos tempos em que o comparamos, a opção -delete foi 40 a 50 vezes mais lenta que a abordagem ideal.

Da mesma forma,

rmdir --ignore-fail-on-non-empty /path/to/huge/folder/*

deve ser abaixo do ideal. O shell expandirá o glob para todas as entradas de diretório (arquivos e pastas) e, antes mesmo de passá-las para rmdir , classificá-las alfabeticamente, o que levará tempo e será completamente desnecessário.

A abordagem combinada deve ser a melhor:

find . -maxdepth 1 -type d -empty -exec rmdir {} +

Observe que o sinal de mais no final evita chamar rmdir para cada diretório. Em vez disso, encontrar reúne tantos nomes de diretório quantos couberem em 128 KiB (por causa do limite do kernel para argumentos de linha de comando) e executa rmdir para todos de uma só vez.

Combinar o acima com ionice não prejudicaria. Se houver "apenas" alguns milhões de diretórios, duvido que seja necessário. Mas como você não sabe o número exato, é melhor prevenir do que remediar.

    
por 04.01.2014 / 01:44

Tags