Wechseln Sie in ein Verzeichnis mit unbekanntem Namen


8

Beim Auspacken eines lsTarballs bin ich auf ein Verzeichnis gestoßen, das als "??????????????? ?????" gemeldet wird. Vermutlich ist der Name nicht in Unicode? Wie auch immer, ich kann keine Möglichkeit finden, auf den Ordner zuzugreifen. Ich habe es versucht cd $(find -inum inode_number), aber das gibt mir

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

Gibt es eine andere Möglichkeit, direkt über die Inode-Nummer auf einen Ordner zuzugreifen?


Ist es vielleicht lexikalisch zuerst in der Verzeichnisliste? Dann cd */könnte es funktionieren. *sollte eine Shell verständliche Beschreibung des Verzeichnisses erweitern und cdzusätzliche Argumente ignorieren. Eine andere Möglichkeit könnte darin bestehen, einen grafischen Dateimanager (einschließlich des terminalbasierten MC) oder die in Vim integrierten Dateibaumnavigatoren zu verwenden. Sie können auch direkt mit dem -execWechsel zu find, not with cd` experimentieren (was eine integrierte Shell ist), aber mit zB lsund anderen Tools.
Daniel Andersson

@ Daniel: In einigen Shells cdschlägt mit mehreren Argumenten fehl.
Scott

@ Scott: Stimmt. POSIX gibt nicht das Verhalten mehrerer Argumente an. Bash und Dash ignorieren zusätzliche Argumente, csh wird mit " too many arguments" beendet.
Daniel Andersson

Antworten:


2

Ein allgemeiner Ansatz, um mit jedem Verzeichnis (oder jeder Datei) arbeiten zu können, besteht darin, die Inode-Nummer zu verwenden.

Verwenden Sie zunächst ls, um den Inode des betreffenden Ordners abzurufen:

ls -lia
  • -l für lange Auflistung (optional)
  • -i um Inode-Werte zu erhalten
  • -a um alle Dateien anzuzeigen, auch versteckte Dateien (optional)

In der Liste sehen Sie eine lange Zahl in der ersten Spalte, ungefähr so:

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

Jetzt können Sie in dieses Verzeichnis wechseln, indem Sie:

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

... aber ersetzen Sie ###### durch die lange Nummer, die Sie in der Verzeichnisliste erhalten haben.

Natürlich muss der Befehl nicht sein cd. Es könnte sein rm, cp, mv, etc ...


2

Da es sich bei den Zeichen wahrscheinlich um internationale Zeichen handelt, werden sie wahrscheinlich als Steuercodes in Ihrem en_US-Zeichensatz angezeigt, weshalb ls sie als Fragezeichen anzeigt.

Dies kann daran liegen, dass Ihre Distribution standardmäßig Aliasing-Ls im globalen Profil auswählt. Zum Beispiel:

alias ls='ls -q'

Sie können feststellen, ob Ihre Distribution dies getan hat, indem Sie in Ihre Shell eingeben:

alias ls

Welches wird so etwas wie das folgende ausdrucken:

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

Die unten verlinkte Seite schlägt vor, dass bei "ls -b" die oktalen Steuercodes angezeigt werden, damit Sie zumindest wissen, welche Zeichen verwendet werden.

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

Vorausgesetzt, das funktioniert nicht, haben Sie eine andere Option, die dort weiter unten erwähnt wird:

Ein mir bisher unbekanntes Tool namens OctalDump (auf Debian - / usr / bin / od)

$ ls | od -b

Zeigt Ihnen die oktale Form der Steuercodes.

$ ls | od -c

Zeigt Ihnen die Zeichen einschließlich aller versteckten zusätzlichen Leerzeichen am Ende (beachten Sie die zusätzlichen Leerzeichen am Ende in ihrem Beispiel).

Sobald Sie wissen, welche Steuerzeichen im Spiel sind und ob zusätzliche versteckte Leerzeichen vorhanden sind, können Sie möglicherweise einen Weg finden, um in das Verzeichnis zu gelangen, indem Sie die Steuerzeichen maskieren. Andernfalls haben Sie mehrere Möglichkeiten, das Verzeichnis umzubenennen.

Die obige Seite enthält auch eine schnelle und schmutzige Methode zum Entfernen der Steuerzeichen über den Befehl mv, die meiner Meinung nach funktionieren wird, solange Sie das Leerzeichen verlassen, aber NICHT den Fragezeichen entkommen (wodurch sie zu einem einzelnen Zeichen werden) Platzhalter), und solange nichts anderes in dem Verzeichnis vorhanden ist, in dem sich dieses Schurkenverzeichnis befindet. Der Grund für diese expliziten Anforderungen liegt darin, dass Sie nur Platzhalterzeichen und das einzelne Leerzeichen verwenden und daher nicht möchten, dass der Platzhalter versehentlich mit einer anderen Datei oder einem anderen Verzeichnis übereinstimmt.

Wenn die oben beschriebene Methode nicht funktioniert, können Sie die in anderen Antworten erwähnte Suchmethode fast sicher auf andere Weise verwenden. Anstatt zu versuchen, mit der Inode-Nummer, die Sie versucht haben, in das Verzeichnis zu wechseln, können Sie es mit der Inode-Nummer umbenennen. Stellen Sie einfach sicher, dass Sie den gesamten Satz von 3 Zeilen für diesen einen Befehl von der obigen Seite kopieren (ersetzen Sie den Teil "gewünschter Name" durch den tatsächlichen Namen, in den Sie ihn jedoch umbenennen möchten).

Sobald das Verzeichnis umbenannt wurde, sollten Sie darauf zugreifen können. Ich kann nur hoffen, dass es nicht auch Dateien mit Steuercodes in den Namen enthält, oder Sie müssen für jede Datei (und / oder jedes Unterverzeichnis) in dem gerade umbenannten Verzeichnis spülen und wiederholen, an welchem ​​Punkt eine for-Schleife wäre wahrscheinlich ist es ratsam, einfach jede Datei als Nummer zu benennen, indem Sie von 1 inkrementieren :-)


0

"?" hat eine besondere Bedeutung in der Shell, es bedeutet "jedes Zeichen, einschließlich keiner". Also, wenn Ihre Datei wirklich den Namen "??????????????? ?????" trägt. Sie müssen wahrscheinlich dem "?" (und Leerzeichen), damit Sie etwas wie cd \? \? \? \? \? \? \? \? \? \? \? \? (wenn du es nicht schon versucht hast)

Dies setzt voraus, dass jemand der Datei absichtlich diesen kniffligen Namen gegeben hat, anstatt diese verstümmelte / beschädigte / illegale Codierung.


1
Aber denken Sie daran , dass lsgerne angezeigt werden Nicht-ASCII - Zeichen (≥0x7F) als ?- so wahrscheinlich der Verzeichnisname nicht nur eine Reihe von Fragezeichen ist.
Scott

0

Mach ein ls. Gibt es irgendetwas im Verzeichnis (Datei oder Unterverzeichnis) mit einem Namen, der länger ist als Ihr Mystery-Unterverzeichnis (21, wenn Ihr "????????????????????????????????????????????? genau)? Benennen Sie sie dann in kürzere Namen um oder verschieben Sie sie in andere Verzeichnisse. Geben Sie dann ein

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

Dieser Platzhalter (20 Fragezeichen, gefolgt von einem Sternchen) sollte mit jedem Namen übereinstimmen, der 20 Zeichen lang oder länger ist - und die erste Anweisung, die ich gegeben habe, sollte sicherstellen, dass Ihr Mystery-Unterverzeichnis das einzige ist, das diesem Muster entspricht. Aber es könnte nützlicher sein, dies zu tun

mv ????????????????????* neuer Name


3
Es kann hilfreich sein, lsentweder --quoting-style=shelloder die --quoting-style=escapeOption auszuführen , um zu erzwingen, dass eine ordnungsgemäß maskierte Version dieses Dateinamens erstellt wird.
Dan D.

1
@ DanD. +1 für coole Option, von der ich nichts wusste. Normalerweise benutze ich nur einen GUI-Dateimanager, wenn so etwas erledigt werden muss, aber es kann nützlich sein, wenn ich von einer Konsole oder in einem Skript aus arbeiten muss.
Joe

0

Eine einfache Möglichkeit, um zu sehen, was sich darin befindet, ist das FTP mit FileZilla auf den Computer. Anschließend können Sie das Verzeichnis mit FileZilla umbenennen.


0

Verwenden Sie einen Dateibrowser wie Midnight Commander (Text), Nautilus (GNOME) oder Dolphin (KDE), um mit dem Verzeichnis zu arbeiten.


0

um mit Verzeichnissen (oder Dateien) zu arbeiten, die seltsame / schwer einzugebende Namen haben:

1) Führen Sie aus ls -i, um den Inode der Datei zu ermitteln.

Diese lsOption gibt Ihnen jeden Dateinamen und eine Kennung für diese Datei im Dateisystem (den Inode).

2) Verwenden Sie find, um einen Befehl für die Datei auszuführen

Angenommen, die Inode war 9961926

du könntest rennen

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

um die Datei zu löschen

oder

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

um es zu einem besseren Namen zu verschieben

oder auch

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

um ihm einen neuen Namen zu geben, während der alte Name beibehalten wird

(Vermutlich könnten Sie auch andere Befehle ausführen. Leider konnte ich diese Zeile nicht verwenden, um a auszuführen. cd)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.