Descompactei um arquivo tar corrompido e consegui terminar com algum diretório que não consigo excluir. Se tentar excluí-lo, parece que ele não pode ser encontrado, mas ls
mostra que está presente, tanto no bash quanto no python que recebo comportamento semelhante, exceto logo depois que eu tento excluí-lo rm -rf
, ls
reclama que ele não pode encontrá-lo e, em seguida, lista-o (veja abaixo depois rm -rf
). O find
comando mostra que o arquivo está presente, mas ainda não consigo pensar em uma maneira de excluí-lo.
Aqui estão minhas tentativas:
Aqui você vê os dois ls
e find
concorda que temos um diretório,
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -print0
./mikeaâcnt
Mas não posso excluí-lo:
rl]$ find -maxdepth 1 -type d -empty -print0 | xargs -0 rm -f -v
rm: cannot remove `./mikeaâ\302\201\302\204cnt': Is a directory
rl]$ ls
mikeaâ??cnt
Eu posso cd
fazer isso e está vazio:
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ pwd
.../rl/mikeaâcnt
mikeaâ^Á^Äcnt]$ cd ../
rl]$ ls
mikeaâ??cnt
veja abaixo que não é um arquivo simples, mas um diretório, além de ls
se comportar de maneira engraçada depois rm -rf
que diz que não consegue encontrar o arquivo e o lista imediatamente:
rl]$ rm mikeaâ^Á^Äcnt/
rm: cannot remove `mikeaâ\302\201\302\204cnt/': Is a directory
rl]$ rm -rf mikeaâ^Á^Äcnt/
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
Portanto, esta é a tentativa com python, o arquivo foi encontrado, mas o nome não pode ser usado como um nome que pode ser excluído:
rl]$ python
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import shutil
>>> os.listdir('.')
['mikea\xc3\xa2\xc2\x81\xc2\x84cnt']
>>> shutil.rmtree(os.listdir('.')[0] )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/shutil.py", line 204, in rmtree
onerror(os.listdir, path, sys.exc_info())
File "/usr/lib64/python2.6/shutil.py", line 202, in rmtree
names = os.listdir(path)
OSError: [Errno 2] No such file or directory: 'mikea\xc3\xa2\xc2\x81\xc2\x84cnt'
mesmo quando uso o preenchimento da guia, o nome escolhido não é utilizável:
rl]$ rm -rf mikeaâ^Á^Äcnt
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
usando o nome que python mostra com bash, recebo o seguinte:
rl]$ rm -rf "mikea\xc3\xa2\xc2\x81\xc2\x84cnt"
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
Existe algo que eu possa fazer para me livrar desse diretório corrompido? O sistema de arquivos subjacente (NFS) parece funcional e nenhum outro problema foi relatado, e eu não tive esses problemas até o arquivo tar corrompido.
EDIT: Aqui está usando find
a própria -exec
opção para chamarrm
rl]$ find -maxdepth 1 -type d -empty -exec rm -f {} \;
find: `./mikeaâ\302\201\302\204cnt': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
mas o arquivo ainda está lá ( ls
reclama que não foi encontrado, mas mostra mesmo assim)
2ª EDIÇÃO:
rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} \;
find: `./mikeaâ\302\201\302\204cnt': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
O comportamento ainda é inalterado, o arquivo ainda está presente
3ª EDIÇÃO:
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} +
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
Parece haver mais no nome do que mikeaâcnt
olhar para a saída da tentativa de python mikea\xc3\xa2\xc2\x81\xc2\x84cnt
e esta captura de tela:
4ª EDIÇÃO: Esta é a tentativa com um curinga:
rl]$ echo *
mikeaâcnt
rl]$ echo mike*
mikeaâcnt
rl]$ rm -rf mike*
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
e meu local:
rl]$ locale
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=
5a Edição:
rl]$ ls -i
ls: cannot access mikeaâcnt: No such file or directory
? mikeaâ??cnt
mas também o comportamento mudou, agora ls
e cd
faça o seguinte:
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt
mikeaâcnt: No such file or directory.
Isso aconteceu após as tentativas de exclusão. Estou pensando que podem ser problemas de NFS, conforme sugerido em uma das respostas aqui por vinc17.
6ª EDIÇÃO: Esta é a saída lsof
els -a
rl] $ / usr / sbin / lsof mikeaâ € ïcnt lsof: erro de status no mikeaâ \ xc2 \ x81 \ xc2 \ x84cnt: esse arquivo ou diretório não existe
acima está errado, aqui está a lsof
chamada correta : (rl é o diretório pai)
rl]$ /usr/sbin/lsof | grep mike | grep rl
tcsh 11926 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
lsof 14733 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
grep 14734 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
grep 14735 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
lsof 14736 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
rl]$
rl]$ ls -a
ls: cannot access mikeaâcnt: No such file or directory
. .. mikeaâ??cnt
7ª Edição: movimento não vai funcionar, (eu tentei antes de tudo isso, mas eu não salvou a saída), mas tem o mesmo problema que ls
e rm
com o arquivo.
8ª EDIÇÃO: use os caracteres hexadecimais, conforme sugerido:
rl]$ ls --show-control-chars | xxd
0000000: 6d69 6b65 61c3 a2c2 81c2 8463 6e74 0a mikea......cnt.
rl]$ rmdir $'mikea\6d69\6b65\61c3\a2c2\81c2\8463\6e74\0acnt'
rmdir: failed to remove `mikea\006d69\006b651c3\a2c2\\81c2\\8463\006e74': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
9a Edição: para o stat
comando:
rl]$ stat mikeaâ^Á^Äcnt
stat: cannot stat `mikeaâ\302\201\302\204cnt': No such file or directory
rl]$
Parece ainda mais provável de toda a saída, há um bug ou outro mau comportamento do NFS, conforme sugerido nos comentários.
Edit 10: Esta é a saída strace em uma essência, pois é tão grande, é a saída ou estes dois comandos:
strace -xx rmdir ./* | grep -e '-1 E'`
strace -xx -e trace=file ls -li`
https://gist.github.com/mikeatm/e07fa600747a4285e460
Edit 11: Então, antes do exposto rmdir
, notei que podia cd
entrar no diretório, mas após o rmdir
não consegui cd
novamente, semelhante a ontem. Os arquivos .
e ..
estavam presentes:
rl]$ ls
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ ls -a
. ..
mikeaâ^Á^Äcnt]$ cd ../
Edição final: vi um administrador local sobre isso e foi resolvido fazendo logon no próprio servidor e excluindo a partir daí. A explicação deles é que poderia ser um problema com conjuntos de caracteres no nome sendo inapropriados.
mv
. talvez você possa excluí-lo depois disso. Como alternativa, você pode tentar mover o diretório para um nível de pasta mais profundo (talvez com um curinga) e excluir a pasta para a qual você o moveu.
find
a saída para um comando diferente em vez de apenas usar suaexec
opção?