AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 552743
Accepted
Codemonkey
Codemonkey
Asked: 2019-11-19 01:23:43 +0800 CST2019-11-19 01:23:43 +0800 CST 2019-11-19 01:23:43 +0800 CST

Conclusão da guia Bash lenta após escrever acidentalmente (mas depois excluir) milhões de arquivos em um diretório

  • 772

No outro dia, tive um erro de script que gravou 4 milhões de pequenos arquivos de texto no meu diretório inicial:

Escrevi acidentalmente 4 milhões de pequenos arquivos de texto em uma pasta, qual a melhor forma de me livrar deles?

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

filesystems
  • 3 3 respostas
  • 121 Views

3 respostas

  • Voted
  1. Best Answer
    Stephen Kitt
    2019-11-19T05:20:11+08:002019-11-19T05:20:11+08:00

    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:

      lsof /home/myname
      
    • copie seu diretório inicial:

      cd /home
      cp -al myname myname.new
      
    • renomeie seu diretório pessoal fora do caminho:

      mv myname myname.old
      
    • renomeie seu novo diretório inicial:

      mv myname.new myname
      

    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 -algarante 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ça myname.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.

    • 7
  2. LustreOne
    2019-11-20T00:01:20+08:002019-11-20T00:01:20+08:00

    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/sdXpor o sistema de arquivos para otimizar os diretórios ( -Dopção). Isso compactará as entradas do diretório no número mínimo de blocos sem copiar os dados do arquivo.

    • 2
  3. cas
    2019-11-23T17:42:57+08:002019-11-23T17:42:57+08:00

    A resposta de Stephen Kitt é basicamente a abordagem correta, mas deve ser feita usando mvem vez de cp- 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:

    1. 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 suou sudo), então obtenha um shell de root.

    2. 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 um cp- 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 cronou atetc 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.

    3. mvtudo 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:

      cd /home
      mv username username.old
      mkdir username
      
      # move the files and subdirectories to the new home
      # BTW, using `find` ensures that "hidden" dotfiles and dotdirs are moved
      # along with the non-hidden files & dirs.
      cd username.old
      find . -mindepth 1 -maxdepth 1 -exec mv {} ../username/ +
      cd ..
      
      # fix ownership and perms of the new home dir
      gid="$(getent passwd username | cut -d: -f4)"
      perms="$(stat --printf "%a" username.old)"
      chown "username:$gid" username
      chmod "$perms" username
      
      rmdir username.old
      

    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 stattem recursos semelhantes, mas as opções são diferentes. Ou apenas defina as permissões no novo diretório manualmente - é mais provável que sejam 775ou 755(possivelmente com set-gid, so 2775ou 2755), mas verifique isso com ls -ldou statou qualquer outra coisa.

    • 0

relate perguntas

  • Qual sistema de arquivos devo usar em um cartão SD em um NAS?

  • Como saber antecipadamente se um .zip tem um diretório pai dentro

  • Disco alocado dinamicamente do Virtualbox *.vdi continua crescendo

  • du/df e ls relatando diferentes usos de disco

  • Como os desenvolvedores do kernel Linux lidam com seu trabalho com milhões de linhas de código? É um método? [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve