du não pode acessar o arquivo - Erro de arquivo ou diretório inexistente

du não pode acessar o arquivo - Erro de arquivo ou diretório inexistente

Tenho muitas subpastas dentro de uma pasta específica que, por sua vez, contém muitos arquivos menores. Eles são criados programaticamente e por isso não sei quantos deles existem dentro.

Decidi remover todas essas subpastas e arquivos e então emiti o comando,

rm -rf foldername/

No entanto, o comando rm está demorando muito para ser executado, o que acredito ser perfeitamente normal, pois é necessário desvincular todos os arquivos.

Porém, resolvi verificar se o tamanho desta pasta está diminuindo emitindo o comando,

du -sh foldername/

No entanto, o comando acima me dá o erro como,

du: cannot access `foldername/file': No such file or directory

Por que esse erro está acontecendo?

Responder1

du, como qualquer comando que percorre árvores de diretórios recursivamente, opera da seguinte maneira:

  1. Leia informações sobre um arquivo, acessado através de seu caminho¹. No caso de du, a chamada do sistemastatfornece o tipo de arquivo (em particular, se é um diretório) e tamanho. Inicialmente, os nomes são retirados da linha de comando.
  2. Se o arquivo for um diretório,abririsso elera lista de nomes de arquivos.
  3. Para cada nome de arquivo no diretório, construa um caminho de arquivo ( ) e atue nele recursivamente começando na etapa 1. Esta etapa pode ser realizada parcialmente em paralelo com a anterior (depende da implementação).DIRECTORY/ENTRY_NAME

rmestá executando e excluindo arquivos um por um. Ocasionalmente, dulê um nome de arquivo na etapa 2, mas quando chega a hora de processá-lo na etapa 3, rmele já foi excluído. Se você verá esse erro e quantas vezes depende da velocidade relativa de rme due é bastante imprevisível.

¹ Existem apenas duas maneiras de acessar diretamente um arquivo: por caminho (incluindo informações de diretório, relativas ou absolutas) ou (se o arquivo estiver aberto) por descritor.

Responder2

Apenas ignore o erro do comando du

Conformeesselink, eu poderia ignorar os duerros apenas mencionando,

du 2> >(grep -v '^du: cannot \(access\|read\)' >&2)

Mas estou mais especificamente interessado em saber o que está acontecendo com a exclusão de arquivos. Estou particularmente interessado em saber por que o ducomando não conseguiu fornecer o tamanho e por que relata o erro quando o rmcomando desvincula os arquivos.

Isto é explicado emesselink. Estou apenas reformulando para ver o que aconteceu aqui.

  1. O rmcomando desvinculou o arquivo. (ou seja, exclua a entrada do nome do arquivo de seu diretório pai).
  2. Porém, o identificador de arquivo ainda permanece válido, embora não haja nenhum nome de arquivo associado a ele. É aqui que o ducomando informa que não vê o arquivo ou diretório.

Verificação

Fiz mais algumas pesquisas para verificar se os arquivos estão de fato desvinculados.

Eu obtive pido processo rm usando pso comando. Agora, emiti o comando abaixo para ver se os arquivos ainda estão disponíveis.

lsof +L | grep 11771

O comando acima me deu a saída abaixo.

rm   11771  root  4r DIR  8,17 175882240     2   47333397 /foldername/filename

Portanto, de acordo com a saída acima, o arquivo está desvinculado.

Como o rmcomando ainda está em execução, o ducomando relata o erro.

informação relacionada