
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:
- Leia informações sobre um arquivo, acessado através de seu caminho¹. No caso de
du
, a chamada do sistemastat
fornece o tipo de arquivo (em particular, se é um diretório) e tamanho. Inicialmente, os nomes são retirados da linha de comando. - Se o arquivo for um diretório,abririsso elera lista de nomes de arquivos.
- 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
rm
está executando e excluindo arquivos um por um. Ocasionalmente, du
lê um nome de arquivo na etapa 2, mas quando chega a hora de processá-lo na etapa 3, rm
ele já foi excluído. Se você verá esse erro e quantas vezes depende da velocidade relativa de rm
e du
e é 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 du
erros 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 du
comando não conseguiu fornecer o tamanho e por que relata o erro quando o rm
comando desvincula os arquivos.
Isto é explicado emesselink. Estou apenas reformulando para ver o que aconteceu aqui.
- O
rm
comando desvinculou o arquivo. (ou seja, exclua a entrada do nome do arquivo de seu diretório pai). - Porém, o identificador de arquivo ainda permanece válido, embora não haja nenhum nome de arquivo associado a ele. É aqui que o
du
comando 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 pid
o processo rm usando ps
o 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 rm
comando ainda está em execução, o du
comando relata o erro.