Przejdź do katalogu o nieznanej nazwie

8

Podczas rozpakowywania archiwum napotkałem katalog, który lszgłasza się jako „??????????????? ?????”. Przypuszczalnie nazwa nie jest w kodzie Unicode? W każdym razie nie mogę znaleźć sposobu na uzyskanie dostępu do folderu. Próbowałem cd $(find -inum inode_number), ale to mi daje

"bash: cd: ./??????????: No such file or directory".

Czy istnieje inny sposób na bezpośredni dostęp do folderu przez jego numer i-węzła?

jackd243
źródło
Czy jest to może leksykalnie pierwsze na liście katalogów? Wtedy cd */może działać. *powinien rozwinąć zrozumiały dla powłoki opis katalogu i cdignoruje dodatkowe argumenty. Innym sposobem może być użycie graficznego menedżera plików (w tym MC opartego na terminalu) lub wbudowanych nawigatorów drzewa plików, np. Vima. Możesz także eksperymentować z -execprzejściem find, not with bezpośrednio na cd` (który jest wbudowany w powłokę), ale np. Z lsinnymi narzędziami.
Daniel Andersson,
@Daniel: W niektórych powłokach cdwiele argumentów kończy się niepowodzeniem.
Scott
@Scott: True. POSIX nie określa zachowania wielu argumentów. Bash i Dash ignorują dodatkowe argumenty, csh wychodzi z „ too many arguments”.
Daniel Andersson

Odpowiedzi:

3

Ogólne podejście, aby móc operować na dowolnym katalogu (lub pliku), polega na użyciu jego numeru i-węzła.

Najpierw użyj ls, aby uzyskać i-węzeł danego folderu:

ls -lia
  • -l do długiej listy (opcjonalnie)
  • -i uzyskać wartości i-węzła
  • -a aby wyświetlić wszystkie pliki, nawet pliki ukryte (opcjonalnie)

Na liście zobaczysz długą liczbę w pierwszej kolumnie, mniej więcej taką:

2104697 drwx------ 2 user group 4096 date time WEIRD_DIRNAME

Teraz możesz przejść do tego katalogu, używając:

cd "$(find -inum ######)"

... ale zastępując ###### długim numerem, który masz na liście katalogów.

Oczywiście polecenie nie musi być cd. To może być rm, cp, mv, etc ...

Tyilo
źródło
2

Ponieważ znaki są prawdopodobnie znakami międzynarodowymi, prawdopodobnie pojawiają się jako kody kontrolne w twoim zestawie znaków en_US, dlatego ls pokazuje je jako znaki zapytania.

Może to wynikać z domyślnego wyboru aliasu przez Twoją dystrybucję w profilu globalnym. Na przykład:

alias ls='ls -q'

Możesz sprawdzić, czy Twoja dystrybucja to zrobiła, wpisując w swojej powłoce:

alias ls

Które wydrukuje coś takiego:

$ alias ls
alias ls='ls --color=auto'

Strona, do której prowadzi link poniżej, sugeruje, że jeśli wykonasz „ls -b”, zobaczysz ósemkowe kody sterujące, abyś wiedział przynajmniej, jakie znaki są w użyciu.

http://www.arsc.edu/arsc/support/howtos/nonprintingchars/

Zakładając, że to nie działa, masz inną opcję wymienioną również bliżej dołu:

Narzędzie, którego dotychczas nie znałem, o nazwie OctalDump (w Debianie - / usr / bin / od)

$ ls | od -b

Pokaże ósemkową formę kodów kontrolnych.

$ ls | od -c

Pokaże ci znaki, w tym wszelkie ukryte dodatkowe białe znaki, które mogą znajdować się na końcu (zwróć uwagę na dodatkowe spacje na końcu w ich przykładzie)

Kiedy już wiesz, jakie znaki kontrolne są w grze i czy są dodatkowe ukryte białe znaki, możesz być w stanie znaleźć sposób na cd do katalogu, unikając znaków kontrolnych. W przeciwnym razie istnieje kilka opcji zmiany nazwy katalogu.

Na powyższej stronie również wygodnie i szybko znajduje się brudna metoda usuwania znaków kontrolnych za pomocą polecenia mv, która, jak sądzę, będzie działać, pod warunkiem, że uciekniesz ze spacji, ale NIE uciekaj przed znakami zapytania (w ten sposób czyniąc je pojedynczymi znakami symbole wieloznaczne) i dopóki w katalogu, w którym znajduje się ten nieuczciwy katalog, nie ma nic innego. Powodem tych jawnych wymagań jest to, że używasz tylko znaków wieloznacznych i pojedynczej spacji, a zatem nie chcesz, aby symbol wieloznaczny przypadkowo pasował do dowolnego innego pliku lub katalogu.

Jeśli powyższa metoda nie działa, prawie na pewno można użyć metody find wspomnianej w innych odpowiedziach w inny sposób. Zamiast próbować cd do katalogu przy użyciu numeru i-węzła, o którym mówiłeś, że próbowałeś, możesz zmienić nazwę za pomocą numeru i-węzła. Po prostu skopiuj cały zestaw 3 wierszy dla tego polecenia z powyższej strony (zamień część „pożądana nazwa” na rzeczywistą nazwę, dla której chcesz zmienić jej nazwę).

Po zmianie nazwy katalogu dostęp do niego powinien być możliwy. Mogę mieć tylko nadzieję, że nie zawiera również plików z kodami sterującymi w nazwach, albo będziesz musiał przepłukać i powtórzyć dla każdego pliku (i / lub podkatalogu) w katalogu, którego nazwa właśnie zmieniłeś, w którym to momencie pętla for prawdopodobnie rozsądnie jest po prostu nazwać każdy plik jako liczbę, zwiększając od 1. :-)

Speeddymon
źródło
0

„?” ma specjalne znaczenie w powłoce, oznacza „dowolny znak, w tym żaden”. Więc jeśli twój plik naprawdę ma nazwę „??????????????? ?????” prawdopodobnie musisz uciec przed „?” (i spacje), abyś mógł wypróbować coś takiego jak cd \? \? \? \? \? \? \ \? \? \? \? (jeśli jeszcze nie próbowałeś)

Zakłada się, że ktoś celowo nadał temu plikowi podchwytliwą nazwę, a nie zniekształcone / uszkodzone / nielegalne kodowanie.

Valrian
źródło
1
Pamiętaj jednak, że lslubi wyświetlać znaki spoza ASCII (≥0x7F) jako ?–– więc nazwa katalogu prawdopodobnie nie jest tylko ciągiem znaków zapytania.
Scott
0

Zrobić ls. Czy w katalogu (pliku lub podkatalogu) jest coś o nazwie dłuższej niż podkatalog „mystery” (czyli 21, jeśli „???????????????????” ”to dokładny)? Następnie zmień ich nazwy na krótsze lub przenieś je do innych katalogów. Następnie wpisz

cd ????????????????????*

Ten symbol wieloznaczny (20 znaków zapytania i gwiazdka) powinien pasować do dowolnej nazwy o długości 20 znaków lub dłuższej - a pierwsza instrukcja, którą podałem, powinna zapewnić, że Twój tajemniczy podkatalog jest jedyną rzeczą, która pasuje do tego wzorca. Ale może być bardziej użyteczne

mv ????????????????????* nowe imie

Scott
źródło
3
Pomocne może być uruchomienie lsz opcją albo --quoting-style=shellalbo --quoting-style=escape, aby zmusić ją do utworzenia odpowiednio ocalonej wersji tej nazwy pliku.
Dan D.
1
@DanD. +1 za fajną opcję, o której nie wiedziałem. Zwykle używam menedżera plików gui, gdy trzeba sobie z tym poradzić, ale może się przydać, jeśli będę musiał pracować z konsoli lub ze skryptu.
Joe
0

Jednym łatwym sposobem, aby zobaczyć, co tam jest, jest przesłanie FTP na maszynę za pomocą FileZilla. Następnie możesz użyć FileZilla do zmiany nazwy katalogu.

kmort
źródło
0

Do pracy z katalogiem używaj przeglądarki plików, takiej jak Midnight Commander (tekst), Nautilus (GNOME) lub Dolphin (KDE).

Michael Hampton
źródło
0

do pracy z katalogami (lub plikami), które mają dziwne / trudne do wpisania nazwy:

1) Uruchom, ls -iaby odkryć i-węzeł pliku.

Ta lsopcja daje każdą nazwę pliku i identyfikator tego pliku w systemie plików (i-węzeł)

2) Użyj polecenia find, aby uruchomić polecenie w pliku

powiedzmy, że i-węzłem było 9961926

możesz biegać

 find * -prune -inum 9961926 -exec rm -i {} \;

aby usunąć plik

lub

 find * -prune -inum 9961926 -exec mv {} other-name \;

aby przenieść go na lepszą nazwę

lub nawet

 find * -prune -inum 9961926 -exec ln -s {} non-horrible-name \;

aby nadać mu nową nazwę, zachowując starą nazwę

(przypuszczalnie możesz również uruchomić inne polecenia. Niestety nie mogłem użyć tej linii do uruchomienia cd)

josinalvo
źródło