Manchmal ist es ärgerlich, auf ein Verzeichnis mit dem Ordnernamen zuzugreifen. Angenommen, ich habe ein Verzeichnis mit dem Namen a b c d
. Gibt es neben der Verwendung Tabeine Möglichkeit, auf den Ordner zuzugreifen, ohne den Namen des Verzeichnisses einzugeben?
Ich weiß, dass Linux für jede einzelne Datei eine eindeutige Kennung hat. Kann ich damit auf den Ordner zugreifen? Ich weiß nicht, ob das tatsächlich geht oder wie es geht.
Ich denke, wenn Linux ein Dateisystem implementiert, vergleicht es die Eindeutigkeit zweier Verzeichnisnamen. Jedes Verzeichnis muss also in einem Leerzeichen eindeutig sein. Aber ich denke, dass es wie ein Primärschlüssel in einem Datenbanksystem ist. Ist der Primärschlüssel der Name des Verzeichnisses oder gibt es eine andere eindeutige Kennung (möglicherweise einige Nummern, die „unter der Haube“ gespeichert sind)?
Versuchen Sie, sich das wie einen Prozess vorzustellen. Wenn Sie den Befehl ps
auf einem Terminal ausführen , wird eine Prozessliste mit dem Namen und der Nummer jedes Prozesses ausgegeben. Sie müssen diesen Prozess mit der Prozessnummer aufrufen. Gibt es auch eine Nummer für ein Verzeichnis, damit Sie das Verzeichnis mit seiner Nummer anrufen können, anstatt es mit seinem Namen anzurufen?
Bei weiteren Untersuchungen habe ich festgestellt, dass jedes Verzeichnis ein eindeutiges Verzeichnis hat inode
. Ich habe jedoch bisher keinen integrierten Befehl gefunden, um über dessen Verzeichnis auf ein Verzeichnis zuzugreifen inode
.
quelle
zsh
stattbash
cd $(icd XXXX)
--- Sie haben diesenfind
Teil einfach neu geschrieben . Jetzt ist Ihre nächste Aufgabe ... überprüfen Sie, was effizienter ist, Ihr Programm oderfind
:-P.Antworten:
Lösung von OP
Hier wurde kein eingebauter Befehl gefunden. Aber schließlich kann ich ein C-Programm schreiben, um cd zu verwenden (nennen wir mein Programm icd == (inode cd)), um mit dem inode-Wert in einen Ordner zu gelangen. Hier poste ich den Rohcode.
Aber es gibt ein grundlegendes Problem, mit dem ich hier konfrontiert bin. Während der Codierungsausführung wird ein C-Code aus einer Bash benötigt, um einen untergeordneten Prozess unter dem Bash-Prozess (übergeordneter Prozess) zu erstellen. Vom untergeordneten Prozess aus ist der Verzeichnisbereich neu, und ich kann von dort aus nicht auf den Verzeichnisbereich des übergeordneten Prozesses zugreifen. Es konnte also nichts getan werden, außer von hier aus ein neues Bash-Fenster aufzurufen. In Zukunft werde ich versuchen, eine neue Tab-Funktion zu implementieren, wenn die Leute daran interessiert sind. Aber ich glaube, ich wurde dafür viel kritisiert. Die Leute könnten also nicht interessiert sein. Ich habe gerade für meine Unterhaltung getan.
RAW-Code wird hier geteilt,
Ich benutze hier Gnome Terminal. Für andere Distributionen wird der Code natürlich geändert.
quelle
Jede Entität in (den meisten) Dateisystemen unter Linux hat eine eindeutige Kennung namens
inode
. Beachten Sie, dass eine Datei mehr als einen Namen ( Hardlink ) haben kann, Verzeichnisse jedoch nur einen Link in allen mir bekannten Dateisystemen haben. Beachten Sie, dass das Inode-Konzept lokal für das Dateisystem ist, sodass bei zwei verschiedenen Geräten (Partition oder was auch immer) die Eindeutigkeit nicht garantiert ist.Sie können den Inode Ihres Verzeichnisses sehen mit
ls -ldi
:Sie wissen also, dass Ihr Verzeichnis den Inode 20873234 hat. Jetzt können Sie mit dem folgenden Befehl dorthin wechseln:
(Beachten Sie, dass
2> /dev/null
Fehlermeldungen zu nicht lesbaren Verzeichnissen entlang des Pfads geschlossen werden sollen.)Dieser Befehl durchsucht das gesamte Home-Verzeichnis. Seien Sie also geduldig. 1
Aber was ist mit der Verwendung
cd
und der TAB-Vervollständigung Ihrer Shell?1. Dies muss das sein 2 ineffizientwas ich je eine Ode geschrieben ... Entropie. Der Grund dafür ist, dass der „Primärschlüssel“, unter dem der Zugriff auf eine Datei oder ein Verzeichnis optimiert, schnell und direkt ist, - wissen Sie was? - der Pfadname :
/dir/dir/file_or_dir
. Um Ihnen Zugriff auf ein bestimmtes Verzeichnis zu gewähren, muss das System außerdem alle Berechtigungen im Pfad überprüfen. Auch hier bedeutet der Zugriff per Inode, dass das Dateisystem rekursiv gescannt wird.2. Nun, Sie können die Sache noch schlimmer machen, indem Sie von scannen
/
. 33. Aber dann funktioniert es nicht, da Inodes nur auf Dateisystembasis (pro Mount) eindeutig sind.
quelle
/dir/dir/file_or_dir
. Ihr C-Programm muss auch das Dateisystem scannen undfind
wurde in den letzten 40 Jahren optimiert ... immer noch --- warum? Wenn Sie eine Verknüpfung benötigen, verwenden Siea="/my/really/strange and long/dir path name/"
und danncd "$a"
. Kann es nicht schlagen. Oder verwenden Sie Symlinks.Sie können Tabdie verfügbaren Ordner drehen, anstatt sie aufzulisten. Bearbeiten Sie die Datei
~/.inputrc
und fügen Sie sie hinzuWenn Sie es für alle Benutzer möchten, bearbeiten Sie es
/etc/inputrc
stattdessen.Drücken Sie Ctrl+ xund Ctrl+ r, um es wirksam zu machen.
Verwenden Sie nun
cd
Tab, um zu Ihrem Ordner zu navigieren, ohne dessen Namen zu schreiben.cd
Shift+ Tabdreht sich in die andere Richtung.Denken Sie daran, dass
cd -
Sie zum zuletzt besuchten Ordner gelangen.quelle
Sie können Shell-Platzhalter verwenden.
Zum Beispiel kann ich tun
oder
Außerdem werden die Platzhalter auf den tatsächlichen Namen erweitert und in dieses Verzeichnis geändert. Angenommen, dies ist das einzige Verzeichnis, das übereinstimmt.
Wenn Sie beide
a b c d
und habena1b2c3d
,cd a?b?c?d
wird auf entwedercd a1b2c3d a b c d
oder erweitertcd a b c d a1b2c3d
(die tatsächliche Reihenfolge hängt vom Kernel, Dateisystem ... ab), und bash bringt Sie stillschweigend zum ersten Pfad.Auf der anderen Seite haben Sie oft nicht so ähnlich benannte Ordner, so etwas
a*d
reicht aus, um dies zu erweitern, ohne alle Zwischenzeichen eingeben zu müssen. Dies ist besonders nützlich, wenn Sie es tatsächlich nicht eingeben können (z. B. wenn sich die Namen in einem anderen Skript oder sogar in einer anderen Codierung befinden) und Sie sonst den Dateinamen oktal codieren müssten.quelle
Sie finden dieses Verzeichnis in einem Dateimanager, z. B. nautilus, und ziehen es einfach per Drag & Drop auf das Terminal.
Wenn Sie zuvor
cd
Terminal eingegeben haben, erhalten Sie den Befehl.quelle
Sie sind sich nicht sicher, ob Sie genau danach fragen, haben aber
zsh
einige nette Tricks, um auf andere Weise auf ein Verzeichnis zuzugreifen, als den strengen Namen des Verzeichnisses einzugeben. Zum einen können Sie einen Teil des Namens eingeben und dieser wird auf den vollständigen Namen des Verzeichnisses erweitert, was sehr nützliche Dinge ermöglicht, zum Beispiel:Schlagen TAB...
quelle
Am einfachsten ist es, auf den Verzeichnisnamen zu doppelklicken (vorausgesetzt, er wird auf dem Bildschirm angezeigt), dann cd gefolgt von Leerzeichen einzugeben und mit der Maus auf das Rad zu klicken. Der markierte Verzeichnisname wird dann kopiert und eingefügt. Durch Drücken der Eingabetaste wird dann in das gewünschte Verzeichnis gewechselt.
Ich benutze dieses Verfahren die ganze Zeit und es ist nicht nur auf Verzeichnisnamen beschränkt. Es kann für alle Befehle über die Befehlszeile verwendet werden.
Viel Glück.
quelle
Wenn es sich nur um ein oder mehrere Verzeichnisse handelt, warum nicht Aliase in Ihrem bashrc oder in welchen Init-Dateien? Zum Beispiel:
Wenn Sie dann dort hineingehen möchten, geben Sie einfach ein
abc
quelle
Sie können ein Programm schreiben, um eine Hash-Tabelle für alle Ihre Betriebssystemverzeichnisse zu erstellen. Es wäre im Grunde ein Baumabflachungsprogramm.
Aber dann könnten Sie so etwas tun
hash-cd 32okjv02
und es würde die Hash-Tabellensuche für die32okjv02
Zuordnung zum Verzeichnis durchführen. und springe zu deinem Verzeichnis. Und es wäre sehr schnell, wenn Sie alle Ihre Verzeichnisse indiziert hätten.Sie müssten den Alias mkdir verwenden, um dieses Programm in jedem neuen Verzeichnis aufzurufen und möglicherweise einen Befehl zum Überprüfen / Aktualisieren der Hash-Tabelle zu schreiben, den Sie jede Minute und bei der Anmeldung erstellen können.
quelle