Ho decompresso un file tar corrotto e sono riuscito a finire con alcune directory che non posso eliminare, se provo a eliminarlo, sembra che non possa essere trovato, ma ls
mostra che è presente, sia con bash che con Python ottengo comportamento simile, tranne che dopo aver provato a eliminarlo con rm -rf
, si ls
lamenta che non riesce a trovarlo, quindi lo elenca (vedi sotto dopo rm -rf
). Il find
comando mostra che il file è presente, ma non riesco ancora a pensare a un modo per eliminarlo.
Ecco i miei tentativi:
Qui vedi entrambi ls
e find
accetti che abbiamo una directory,
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -print0
./mikeaâcnt
Ma non posso cancellarlo:
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
Posso cd
farlo ed è vuoto:
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ pwd
.../rl/mikeaâcnt
mikeaâ^Á^Äcnt]$ cd ../
rl]$ ls
mikeaâ??cnt
vedi sotto che non è un semplice file ma una directory, inoltre ls
si comporta in modo divertente dopo rm -rf
che dice che non riesce a trovare il file quindi lo elenca subito dopo:
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]$
Quindi questo è il tentativo con Python, il file viene trovato, ma il nome non è utilizzabile come nome che può essere eliminato:
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'
anche quando uso il completamento della scheda il nome che prende non è utilizzabile:
rl]$ rm -rf mikeaâ^Á^Äcnt
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
usando il nome che Python mostra con bash ottengo questo:
rl]$ rm -rf "mikea\xc3\xa2\xc2\x81\xc2\x84cnt"
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
C'è qualcosa che posso fare per sbarazzarmi di questa dir corrotta? Il file system sottostante (NFS) sembra funzionale e non vengono segnalati altri problemi, e non ho avuto tali problemi fino al file tar corrotto.
EDIT: Qui sta usando find
l' -exec
opzione propria di chiamarerm
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]$
ma il file è ancora lì, (si ls
lamenta che non lo trova, ma lo mostra comunque)
2a modifica:
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
Il comportamento è ancora invariato, il file è ancora presente
3a modifica:
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
Sembra che ci sia qualcosa di più nel nome che mikeaâcnt
guardare l'output del tentativo di Python mikea\xc3\xa2\xc2\x81\xc2\x84cnt
, e questo screenshot:
4 ° EDIT: questo è il tentativo con un jolly:
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 il mio locale:
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 modifica:
rl]$ ls -i
ls: cannot access mikeaâcnt: No such file or directory
? mikeaâ??cnt
ma anche il comportamento è cambiato, ora ls
e cd
fai questo:
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.
Questo è successo dopo i tentativi di eliminazione, sto pensando che potrebbero essere problemi di NFS come suggerito in una delle risposte qui da vinc17.
6 ° EDIT: questo è l'output di lsof
els -a
rl] $ / usr / sbin / lsof mikeaâ ^ Á ^ Äcnt lsof: errore di stato su mikeaâ \ xc2 \ x81 \ xc2 \ x84cnt: nessun file o directory
sopra è sbagliato, ecco l' lsof
invocazione corretta : (rl è la directory principale)
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
7a modifica: lo spostamento non funzionerà (l'ho provato prima di tutto, ma non ho salvato l'output), ma ha lo stesso problema ls
e rm
con il file.
8a EDIT: questo sta usando i caratteri esadecimali come suggerito:
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 modifica: per il stat
comando:
rl]$ stat mikeaâ^Á^Äcnt
stat: cannot stat `mikeaâ\302\201\302\204cnt': No such file or directory
rl]$
Sembra ancora più probabile da tutto l'output, c'è un bug o un altro comportamento scorretto di NFS come suggerito nei commenti.
Modifica 10: Questo è l'output di Strace in breve poiché è così grande, è l'output o questi due comandi:
strace -xx rmdir ./* | grep -e '-1 E'`
strace -xx -e trace=file ls -li`
https://gist.github.com/mikeatm/e07fa600747a4285e460
Modifica 11: Prima di quanto sopra rmdir
ho notato che potevo cd
entrare nella directory, ma dopo rmdir
non ho potuto di cd
nuovo, simile a ieri. I file .
e ..
erano presenti:
rl]$ ls
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ ls -a
. ..
mikeaâ^Á^Äcnt]$ cd ../
Modifica finale: ho visto un amministratore locale su questo ed è stato risolto accedendo al server stesso ed eliminando da lì. La spiegazione da loro è che potrebbe essere un problema con insiemi di caratteri nel nome inappropriati.
mv
. forse puoi eliminarlo dopo quello. In alternativa, puoi provare a spostare la directory su un livello di cartella più profondo (magari con un carattere jolly) e quindi eliminare la cartella in cui l'hai spostata.
find
il piping dell'output a un comando diverso invece di utilizzare solo l'exec
opzione?