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.
find
dane wyjściowe do innego polecenia zamiast po prostu używać jegoexec
opcji?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.Odpowiedzi:
Poniższy fragment tego eseju potencjalnie wyjaśnia, dlaczego ten katalog odmawia usunięcia:
źródło
Jednym ze sposobów usuwania takich plików / katalogów jest odwołanie do i-węzła.
Aby znaleźć i-węzły dla elementów w bieżącym katalogu:
Aby usunąć to:
źródło
?
odniesienie do i-węzła. Jak to usunąć?Nie należy używać znaków innych niż ASCII w wierszu polecenia, ponieważ, jak widać, z jakiegoś powodu niekoniecznie odpowiadają one nazwie pliku (Unicode ma różne sposoby wyrażania liter akcentowanych). Coś jak:
powinien działać, ponieważ nazwa pliku jest generowana bezpośrednio przez powłokę. Ale upewnij się, że jest tylko jedno dopasowanie (zrób
echo mike*
pierwszy, aby potwierdzić).Cóż, jeśli
cd
działa, to nie ma powodu, dla którego powinienemrm
lubls
powinienem powiedziećNo such file or directory
, aby problem mógł występować na poziomie systemu plików.Uwaga: Nie używaj
ls
do sprawdzania, czy katalog jest pusty, alels -a
.Katalog może być nadal używany przez inny proces (w tym jeśli jest to plik cwd jakiegoś procesu). IMHO, dlatego wciąż „istnieje”, ale może powodować błędy, np. Z
ls
;lsof
może dać ci trochę informacji, ale w NFS musisz dowiedzieć się, która maszyna z niego korzysta. Zwłaszcza w przypadku NFS może to powodować dziwne błędy.ls -a
w katalogu nadrzędnym może.nfs*
w niektórych przypadkach wyświetlać pliki / katalogi.Kiedy dostaniesz:
Podejrzewam, że plik nadal istnieje w tabeli katalogów z powodu buforowania NFS i / lub ponieważ jest używany przez inny proces, ale bez powiązanych informacji. Podczas
ls
próby uzyskania informacji o samym pliku pojawia się błąd, ponieważ sam plik już nie istnieje (znajduje się tylko w tabeli katalogów), stąd wyświetlany błąd. Następniels
wyświetla nazwę pliku, ponieważ znajduje się w tabeli katalogów. Fakt, że masz znaki zapytania w jednym przypadku, ale nie w drugim przypadku, wynika z błędu wyświetlanials
IMHO (niezwiązanego z twoim problemem).źródło
Osobiście przetestowane przy użyciu
find
„s-exec
dyrektywę:Folder został poprawnie utworzony i poprawnie usunięty.
Jak wskazał @Igeorget , istnieje jeszcze prostsza metoda, jeśli masz GNU
find
:Przetestowałem również to polecenie i działa ono poprawnie
źródło
-delete
opcja.Wierzę, że miałem ten sam problem. Wcześniej widziałem problem z nazwą pliku
☃
.ls
w tym przypadku wyświetlał plik jakoâ??
, ale udało mi się go usunąćrm ☃
.Doprowadziło mnie to do następującego sposobu konwersji niewłaściwej nazwy na poprawną:
Najpierw pobierz bajty nazwy pliku:
Następnie zdekoduj te bajty jako UTF-8, aby uzyskać punkty kodowe Unicode, używając szesnastkowego wejścia tej witryny, na przykład: http://software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder
Zauważ, że wszystkie znajdują się poniżej granicy bajtów. Otrzymujemy następujące bajty:
Jeśli potraktujemy tę sekwencję w UTF-8, otrzymamy:
I tak twoja nazwa pliku to:,
mikea⁄cnt
z ułamkiem ułamkowym zamiast zwykłego do przodu. Możesz teraz przekazać tę nazwę dormdir
.źródło
Po uzyskaniu poprawnego kodu szesnastkowego nazwy pliku / folderu (używając dowolnej metody, którą uznam za stosowną, mogę wybrać
ls --show-control-chars | xxd
), należy zastosować specjalną konstrukcję, aby adresować takie znaki podczas działania w bash:W przeciwnym razie odwrotne ukośniki są traktowane jak odwrotny waniliowy.
źródło
ls
zawiera nowy wiersz w danych wyjściowych, a „cnt” jest duplikowane. Może możesz spróbować skopiować i wkleić wiersz w mojej odpowiedzi i sprawdzić, czy jest skuteczny?LC_*
iLANG
env) i zamontowanie NFS bez żadnych opcji zestawu znakówCzy próbowałeś użyciu
rm -rf ./mikeaâcnt
lubrm -rf "./mikeaâcnt"
czy ścieżka bezwzględna? Zamiast tegorm
spróbujrmdir ./mikeaâcnt
.źródło
mikeaâcnt
wydają się nie być nazwą pliku, ale co sięls
wyświetla, patrz trzecia edycjaCzy próbowałeś uzyskać i-węzeł tego pliku za pomocą
stat
:To powinno dać ci numer i-węzła (i inne dane), a następnie możesz spróbować go usunąć.
źródło
stat
zachowaniem,Miałem podobne problemy. Czy masz Gnome, KDE lub Xwindow DM ?. Jeśli otworzysz broser pliku i usuniesz go stamtąd.
To powinno działać.
Chciałbym zobaczyć rozwiązanie z wiersza poleceń, ale w moim przypadku i po stracie dużo czasu próbując wymyślić, jak je usunąć z wiersza poleceń, stwierdziłem, że było to tak proste, jak usunięcie dowolnego innego pliku z nautilus lub każdy inny eksplorator plików (prawda jest taka, że próbowałem tylko z nautilus).
źródło