Encolher / redefinir o tamanho do diretório?

11

Existe uma maneira de reduzir uma entrada de diretório?

Meus diretórios dovecot maildir aumentaram de tamanho do padrão 4096 para vários megas, e estão interferindo nas cotas de disco.

A única maneira que encontrei é excluir e recriar o diretório. Espero que exista uma função mágica em algum lugar - estou aberto a qualquer coisa, exceto para o assembler codificado à mão.

Edit: Para posteridade, para encontrar dirents> 4096:

 find / -type d -size +4k -printf "%s\t%p\t%i\n" | sort -nr
mikewaters
fonte
Consulte também stackoverflow.com/questions/4303008/…
oliver

Respostas:

6

Veja também rm em um diretório com milhões de arquivos ; tangencialmente relacionados, mas nós discutimos isso lá.

Até onde eu sei, pelo menos no ext2 / 3, não, não há como (online) reduzir os arquivos excluindo + recriar. Desmontadas, várias fontes sugerem que e2fsck -Dpode funcionar, embora eu não possa reivindicar nenhuma experiência pessoal com essa opção.

Algumas referências para leitura adicional:

BMDan
fonte
1
A primeira ligação foi especialmente útil: ele dirigiu o meu problema especificamente (servidores de correio), e o fato de que Ted Tso opinou sobre o diálogo é muito legal;)
mikewaters
3

Recentemente, tive que excluir e recriar um diretório NFS para diminuir seu tamanho depois que ele havia inchado anteriormente. No processo, encontrei uma maneira bastante eficiente de fazer isso usando rsync e links físicos. Esse método evita copiar os arquivos reais, enquanto ainda cumpre o objetivo de recriar o diretório com o mesmo conteúdo.

Como precisávamos de um tempo de inatividade para fazer essa operação durante nossa janela de manutenção, disponibilizar o diretório reconstruído o mais rápido possível foi importante para nós. Se a simplicidade for mais importante para você, altere o primeiro comando de movimentação para um 'rm -rf' no diretório de origem e pule o outro comando 'rm -rf'.

Eu extraí esses comandos de um processo maior e abstraí os nomes dos diretórios, então peço desculpas se cometi um erro nessa tradução.

mkdir /tmp/holding_dir/
rsync -ai --delete --link-dest=/path/to/source_dir/ /path/to/source_dir/ /tmp/holding_dir/
mv /path/to/source_dir/ /tmp/deleteme/
mv /tmp/holding_dir/ /path/to/source_dir/

Depois, removemos o diretório Dependendo do tamanho, pode ser necessário usar uma técnica mais sofisticada para fazer isso. Por exemplo, o uso do rsync com o sinalizador --delete para sincronizar um diretório vazio nesse diretório pode ser mais eficiente.

rm -rf /tmp/deleteme/
Dan McCarthy
fonte
2

Eu faria assim.

cp -aloldir newdir && mvolddir tempname && mvnewdir olddir && rm -rtempname

onde olddir é o diretório que você deseja reduzir newdir e tempname são nomes de arquivos temporários

cp -alcria links para o conteúdo de olddir em newdir e os próximos três comandos os trocam por newdir e limpam.

user313114
fonte
liso. nunca soube sobre -l cp
Kevin Buchs