Rozpakowałem uszkodzony plik tar i udało mi się skończyć z katalogiem, którego nie mogę usunąć. Jeśli spróbuję go usunąć, wygląda na to, że nie można go znaleźć, ale ls
pokazuje, że jest obecny, zarówno z bash, jak i python. podobne zachowanie, z wyjątkiem zaraz po tym, jak spróbuję go usunąć rm -rf
, ls
narzeka, że nie może go znaleźć, a następnie wyświetla listę (patrz poniżej po rm -rf
). find
Podaje komunikat, że plik jest obecny, ale nadal nie mogę wymyślić sposób, aby go usunąć.
Oto moje próby:
Tutaj widzisz oba ls
i find
zgadzasz się, że mamy katalog,
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -print0
./mikeaâcnt
Ale nie mogę go usunąć:
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
Mogę cd
to zrobić i jest puste:
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ pwd
.../rl/mikeaâcnt
mikeaâ^Á^Äcnt]$ cd ../
rl]$ ls
mikeaâ??cnt
patrz poniżej, że nie jest to zwykły plik, ale katalog, plus ls
zachowuje się zabawnie po tym, rm -rf
jak mówi, że nie może znaleźć pliku, a następnie wyświetla go zaraz po:
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]$
To jest próba z pythonem, plik został znaleziony, ale nazwa nie nadaje się do użycia jako nazwa, którą można usunąć:
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'
nawet gdy używam uzupełniania tabulatorem, nazwa, którą wybiera, nie jest użyteczna:
rl]$ rm -rf mikeaâ^Á^Äcnt
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
używając nazwy, którą Python pokazuje przy pomocy bash, otrzymuję to:
rl]$ rm -rf "mikea\xc3\xa2\xc2\x81\xc2\x84cnt"
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
Czy mogę coś zrobić, aby pozbyć się tego zepsutego katalogu? Podstawowy system plików (NFS) wydaje się funkcjonalny i nie zgłoszono żadnych innych problemów, a ja nie miałem takich problemów, dopóki nie został uszkodzony plik tar.
EDYCJA: Oto find
własna -exec
opcja, aby zadzwonićrm
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]$
ale plik nadal tam jest ( ls
narzeka, że nie może go znaleźć, ale mimo to pokazuje)
2. EDYCJA:
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
Zachowanie jest nadal niezmienione, plik nadal obecny
3. EDYCJA:
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
Wydaje się, że w nazwie kryje się coś więcej niż tylko mikeaâcnt
spojrzenie na wynik próby Pythona mikea\xc3\xa2\xc2\x81\xc2\x84cnt
i ten zrzut ekranu:
4. EDYCJA: To jest próba z dziką kartą:
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
i moje ustawienia regionalne:
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=
5. edycja:
rl]$ ls -i
ls: cannot access mikeaâcnt: No such file or directory
? mikeaâ??cnt
ale także zachowanie się zmieniło, teraz ls
i cd
zrób to:
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.
Stało się to po próbach usunięcia, myślę, że mogą to być problemy z NFS, jak sugeruje jedna z odpowiedzi tutaj przez vinc17.
6. EDYCJA: To jest wyjście z lsof
ils -a
rl] $ / usr / sbin / lsof mikeaâ ^ Á ^ Ęcnt lsof: błąd statusu na mikeaâ \ xc2 \ x81 \ xc2 \ x84cnt: Brak takiego pliku lub katalogu
powyższe jest nieprawidłowe, oto poprawne lsof
wywołanie: (rl to katalog nadrzędny)
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-cia Edit: ruch nie będzie działać, (próbowałem go przed tym wszystkim, ale nie uchroniło wyjścia), ale ma ten sam problem jak ls
i rm
z pliku.
8. EDYCJA: używa sugerowanych znaków szesnastkowych:
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]$
9. edycja: dla stat
polecenia:
rl]$ stat mikeaâ^Á^Äcnt
stat: cannot stat `mikeaâ\302\201\302\204cnt': No such file or directory
rl]$
Wydaje się to jeszcze bardziej prawdopodobne na podstawie wszystkich danych wyjściowych, istnieje błąd lub inne niewłaściwe zachowanie NFS, jak sugerowano w komentarzach.
Edycja 10: To jest wyjście strace w gist, ponieważ jest tak duże, jego wyjście lub te dwa polecenia:
strace -xx rmdir ./* | grep -e '-1 E'`
strace -xx -e trace=file ls -li`
https://gist.github.com/mikeatm/e07fa600747a4285e460
Edycja 11: Tak więc przed powyższym rmdir
zauważyłem, że mogę cd
wejść do katalogu, ale po tym rmdir
nie mogłem cd
ponownie, podobnie jak wczoraj. Te .
i ..
pliki były obecne:
rl]$ ls
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ ls -a
. ..
mikeaâ^Á^Äcnt]$ cd ../
Ostateczna edycja: widziałem nad tym lokalnego administratora i problem został rozwiązany przez zalogowanie się do samego serwera i usunięcie z niego. Wyjaśnienie z nich jest takie, że może to być problem z niewłaściwymi zestawami znaków w nazwie.
mv
. może potem możesz go usunąć. Alternatywnie możesz spróbować przenieść katalog na głębszy poziom folderu (być może z użyciem symbolu wieloznacznego), a następnie usunąć folder, do którego został przeniesiony.
find
dane wyjściowe do innego polecenia zamiast po prostu używać jegoexec
opcji?