No outro dia, tive um erro de script que gravou 4 milhões de pequenos arquivos de texto no meu diretório inicial:
Eu apaguei esses arquivos, mas desde então sempre que clico em tab para completar um nome de arquivo ou caminho, há um atraso de meio segundo antes que algo aconteça.
Embora os arquivos agora sejam excluídos, presumo que haja algum dano duradouro ao gpt ou similar? Existem ferramentas úteis que eu possa usar para limpar isso?
O sistema de arquivos é ext4 (duas unidades de 3 TB em RAID 1) e estou executando o CentOS 7.
% ls -ld "$HOME"
drwx------. 8 myname myname 363606016 Nov 18 09:21 /home/myname
obrigada
Como mencionado nos comentários, seu próprio diretório pessoal é enorme e não encolherá novamente. A varredura do conteúdo do seu diretório inicial envolverá a leitura de muitos dados, todas as vezes (do cache ou do disco).
Para corrigir isso, você precisa recriar seu diretório inicial:
saia, faça login como root e certifique-se de que nenhum processo em execução se refira ao seu diretório pessoal:
copie seu diretório inicial:
renomeie seu diretório pessoal fora do caminho:
renomeie seu novo diretório inicial:
Você pode fazer login novamente agora. Seu novo e brilhante diretório pessoal ocupará apenas o espaço de que realmente precisa, e as operações de arquivo devem ser tão rápidas quanto você espera.
cp -al
garante que todos os arquivos estejam disponíveis no novo diretório, mas usa links físicos para que nenhum espaço adicional seja ocupado (além da estrutura do diretório). Por causa dos links físicos, quaisquer alterações feitas nos arquivos em um dos diretórios são refletidas no outro diretório, mas você pode remover com segurançamyname.old
.Uma abordagem semelhante pode ser usada para qualquer diretório que costumava conter um grande número de arquivos, embora na maioria dos outros casos você não precise fazer logout primeiro.
Conforme mencionado na outra resposta, se você puder recriar facilmente o diretório, isso poderá ser feito sem desligar o sistema.
Em outros casos, onde o número ou o tamanho dos arquivos na árvore de diretórios tornam mais difícil copiá-los para um novo diretório, você também pode desmontar o sistema de arquivos (ou inicializar a partir de um disco de recuperação se for o sistema de arquivos raiz) e executar
e2fsck -fD /dev/sdX
por o sistema de arquivos para otimizar os diretórios (-D
opção). Isso compactará as entradas do diretório no número mínimo de blocos sem copiar os dados do arquivo.A resposta de Stephen Kitt é basicamente a abordagem correta, mas deve ser feita usando
mv
em vez decp
- não há necessidade de gastar vários minutos ou horas copiando todos os arquivos, ao movê-los quase não levará tempo. Por exemplo:saia como seu usuário (TODAS as instâncias de login, incluindo qualquer sessão ssh) e faça login como root.
Se o seu sistema estiver configurado para impedir o login direto do root (por exemplo, porque o root tem uma senha desabilitada), faça o login como um usuário diferente (crie um se necessário e dê acesso a
su
ousudo
), então obtenha um shell de root.Não deve haver necessidade de certificar-se de que nada está sendo executado como seu usuário ou tem arquivos abertos em seu diretório inicial porque os identificadores de arquivo (e os números de inode) NÃO serão alterados a menos que seu diretório inicial tenha seu próprio sistema de arquivos dedicado (por exemplo, se
/home/username
é seu próprio ponto de montagem, e não apenas um subdiretório de/home
).A movimentação real (na Etapa 3 abaixo) deve levar apenas uma fração de segundo (dependendo do número de arquivos e diretórios no nível superior do seu diretório inicial, que é tudo o que precisa ser movido) porque é um
mv
, não umcp
- nenhum dado é copiado, tudo é feito muito rapidamente renomeando.É extremamente improvável que algo crie novos arquivos (ou tente abrir um arquivo que ainda não foi movido) durante esse curto período de tempo.
No entanto, se você é paranóico, ou se é provável que um trabalho
cron
ouat
etc possa fazer isso, desative-os temporariamente. Lembre-se de reiniciá-los depois.O mesmo para qualquer outro processo em execução (por exemplo, NFS ou samba ou entrega de correio ou um ftpd ou qualquer outra coisa) que provavelmente fará isso - mate-os agora e reinicie-os mais tarde. BTW, você pode matar todos os processos de propriedade do usuário com, por exemplo,
pkill -u username
.mv
tudo em seu diretório pessoal para um novo diretório pessoal. por exemplo, se o seu diretório inicial for/home/username
, execute o seguinte como root:Nota: o
stat --printf ...
acima requer GNU stat. Você disse que está executando o Centos 7, então é isso que você tem.Para qualquer um com um problema semelhante em um sistema não GNU, você terá que encontrar outra maneira de duplicar as permissões. A versão do FreeBSD
stat
tem recursos semelhantes, mas as opções são diferentes. Ou apenas defina as permissões no novo diretório manualmente - é mais provável que sejam775
ou755
(possivelmente com set-gid, so2775
ou2755
), mas verifique isso comls -ld
oustat
ou qualquer outra coisa.