Wie kann ich in ein Verzeichnis wechseln, ohne seinen Namen zu schreiben?

8

Manchmal ist es nervig, auf ein Verzeichnis mit dem Ordnernamen zuzugreifen. Angenommen, ich habe ein Verzeichnis namens a b c d . Gibt es neben der Verwendung von Tab eine Möglichkeit, auf den Ordner zuzugreifen, ohne den Namen des Verzeichnisses einzugeben?

Ich weiß, dass Linux jede einzelne Datei eindeutig identifiziert. Kann ich damit auf den Ordner zugreifen? Ich weiß nicht, ob das tatsächlich gemacht werden kann oder wie es gemacht wird.

Ich denke, wenn Linux ein Dateisystem implementiert, vergleicht es die Eindeutigkeit zweier Verzeichnisnamen. Daher muss jedes Verzeichnis in einem Space 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 einen anderen eindeutigen Bezeichner (vielleicht einige Zahlen, die "unter der Haube" gespeichert sind)?

Versuchen Sie, dies als einen Prozess zu betrachten. Wenn Sie auf einem Terminal den Befehl ps 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, so dass Sie das Verzeichnis mit seiner Nummer aufrufen können, anstatt es mit seinem Namen aufzurufen?

Bei weiteren Untersuchungen habe ich festgestellt, dass jedes Verzeichnis ein eindeutiges inode hat. Ich habe jedoch bisher keinen eingebauten Befehl gefunden, um auf ein Verzeichnis mit seinem inode zuzugreifen.

    
Maruf 08.08.2015, 15:58

8 Antworten

1

Lösung von OP

gemacht

Kein eingebauter Befehl hier gefunden. Aber schließlich kann ich ein C-Programm schreiben, um cd (lasst mein Programm icd == (inode cd)) zu benutzen, um in einen Ordner mit inode-Wert einzutreten. Hier poste ich den Rohcode.

Aber es gibt ein grundlegendes Problem, dem ich hier begegnet bin. Während der Codierungsausführung wird ein C-Code aus einer Bash benötigt, um einen Kindprozess unter dem Bash-Prozess (Elternprozess) zu erzeugen. Von dem Kindprozess ist der Verzeichnisspeicherplatz neu und ich kann von dort nicht auf den Verzeichnisbereich des übergeordneten Prozesses zugreifen. Also konnte nichts getan werden, außer dass von hier aus ein neues Bash-Fenster aufgerufen wurde. In Zukunft werde ich versuchen, eine neue Tab-Funktion zu implementieren, wenn Leute daran interessiert sind. Aber ich glaube, dass ich dafür eine Menge Kritik bekommen habe. Also sind die Leute vielleicht nicht interessiert. Ich habe es gerade zu meiner Belustigung getan.

RAW-Code wird hier geteilt,

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include<dirent.h>
#include <unistd.h>
#include <grp.h>
#include<pwd.h>

using namespace std ;

int main(int argc , char *argv[] ) {

  struct stat ITR ;

  if( argc != 2 ) {
    printf("\nWrong Command\n\n") ;
    return 1 ;
  }

  long long given_inode = 0 ;
  for( int i =0 ; argv[1][i] ; i++ ){
    given_inode *= 10 ;
    given_inode += (argv[1][i]-'0') ;
  }

//  if (stat(argv[1], &ITR) == -1) {
//    perror("stat");
//    return 1  ;
//  }

  printf("%s\n",argv[0]) ;
    char PWD[1000] ; 
    getcwd( PWD , 1000 ) ;

  DIR *d;
  struct dirent *p;
  char path[100000] ;
  d = opendir(".");
  if( d != NULL ) {
    while( (p = readdir(d))!= NULL ) {
        strcpy( path , "./" ) ;
        strcat( path, p->d_name ) ;
        stat(path, &ITR) ;
        //printf("%s --> ",path) ;
        //printf("%ld\n",ITR.st_ino) ;
        if( ITR.st_ino == given_inode ) {
          strcpy( path , "gnome-terminal --working-directory=" ) ;
          strcat( path, PWD ) ;
                    strcat( path, "/" ) ;
                    strcat( path, p->d_name ) ;
                    system(path) ; 
                    //printf("%s\n",path) ;
                    return 0 ;
        }
    }
  }
  printf("icd %lld:No such file or directory\n",given_inode) ;
  return 0 ;

}

Ich benutze Gnome-Terminal hier. Offensichtlich Für andere Distributionen wird der Code geändert.

    
Pilot6 11.08.2015, 17:23
18

Jede Entität in (den meisten) Dateisystemen unter Linux hat eine eindeutige Kennung namens inode . Beachten Sie, dass eine Datei mehr als einen Namen haben kann ( hardlink ), aber Verzeichnisse haben nur einen Link in allen mir bekannten Dateisystemen von. Beachten Sie, dass das Konzept von inode für das Dateisystem lokal ist, sodass in zwei verschiedenen Geräten (Partition oder was auch immer) die Eindeutigkeit nicht garantiert ist.

Sie können den Inode Ihres Verzeichnisses mit ls -ldi :

sehen
[:~] % ls -ldi tmp/uffa                     
20873234 drwxrwxr-x 2 romano romano 4096 Jun 26  2014 tmp/uffa

Sie wissen also, dass Ihr Verzeichnis inode 20873234 hat. Jetzt können Sie mit dem Befehl:

zu ihm wechseln
[:~] % cd "$(find ~ -inum 20873234 2> /dev/null)"  
[:~/tmp/uffa] %

(Beachten Sie, dass das 2> /dev/null Fehlermeldungen über nicht lesbare Verzeichnisse entlang des Pfades schließt.)

Dieser Befehl scannt das gesamte Home-Verzeichnis. Seien Sie also geduldig. 1

Aber was ist mit der Verwendung von cd und der TAB-Vervollständigung Ihrer Shell?

1. Das muss die ineffizienteste Sache sein, die ich je geschrieben habe ... eine Ode an die Entropie. Der Grund ist, dass der "Primärschlüssel", unter dem der Zugriff auf eine Datei oder ein Verzeichnis optimiert wird, schnell und direkt ist - rate mal 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 ... also bedeutet der Zugriff durch Inode erneut das rekursive Durchsuchen des Dateisystems.

2. Nun, Sie können es noch schlimmer machen, indem Sie von / . 3

scannen

3. Aber dann wird es nicht funktionieren, weil Inodes nur auf einer pro-Dateisystem-Basis (pro Mount) eindeutig sind.

    
Rmano 08.08.2015 17:00
7

Sie können Tab verwenden, um die verfügbaren Ordner zu rotieren anstatt sie aufzulisten. Bearbeiten Sie die Datei ~/.inputrc und fügen Sie

hinzu
"\C-i": menu-complete
"\e[Z": "\e-1\C-i"

Wenn Sie es für alle Benutzer möchten, bearbeiten Sie stattdessen /etc/inputrc .

Drücken Sie Strg + x und Strg + r , um es wirksam zu machen.

Verwenden Sie nun cd Tab , um zu Ihrem Ordner zu navigieren, ohne dessen Namen zu schreiben. cd Shift + Tab wird sich in die andere Richtung drehen.

Es lohnt sich, daran zu denken, dass cd - Sie zum zuletzt besuchten Ordner führt.

    
Katu 09.08.2015 00:06
5

Sie können Shell-Platzhalter verwenden.

Zum Beispiel kann ich

tun
cd a?b?c?d

oder

cd a\*b\*c\*d

Und es wird die Platzhalter auf den tatsächlichen Namen erweitern und in dieses Verzeichnis wechseln. Angenommen, das ist das einzige übereinstimmende Verzeichnis.

Wenn Sie sowohl a b c d als auch a1b2c3d haben, dann wird cd a?b?c?d entweder auf cd a1b2c3d a b c d oder cd a b c d a1b2c3d erweitert (die tatsächliche Reihenfolge hängt vom Kernel, Dateisystem usw. ab), und bash wird stillschweigend bewege dich zum ersten Pfad.

Auf der anderen Seite haben Sie oft nicht so ähnlich benannte Ordner, also reicht etwas wie a*d aus, um das zu erweitern, ohne alle Zwischenzeichen eingeben zu müssen. Dies ist besonders nützlich, wenn Sie es nicht wirklich eingeben können (zB die Namen sind in einem anderen Skript oder sogar einer anderen Kodierung), und Sie hätten sonst den Dateinamen oktal kodieren müssen.

    
Ángel 08.08.2015 23:52
3

Sie finden dieses Verzeichnis in einem Dateimanager, z. Nautilus und ziehen Sie es einfach zum Terminal.

Wenn Sie cd im Terminal eingegeben haben, erhalten Sie den Befehl.

    
Pilot6 08.08.2015 16:04
1

Nicht sicher, ob Sie genau danach fragen, aber zsh hat einige nette Tricks, um auf andere Weise auf ein Verzeichnis zuzugreifen, als den strikten Namen des Verzeichnisses einzugeben; Zum einen können Sie einen Teil des Namens eingeben und er wird auf den vollständigen Namen des Verzeichnisses erweitert, was sehr nützliche Dinge ermöglicht, zum Beispiel:

Schlagen TAB ...

    
kos 08.08.2015 17:53
1

Am einfachsten ist es, wenn Sie auf den Verzeichnisnamen doppelklicken (vorausgesetzt, es ist auf dem Bildschirm sichtbar), dann cd gefolgt von Leerzeichen eingeben und auf den Radschalter auf Ihrer Maus klicken, und den Verzeichnisnamen, den Sie haben, kopieren und einfügen markiert. 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 verwendet werden, die die Befehlszeile verwenden.

Viel Glück.

    
Allen 13.08.2015 00:01
1

Wenn es nur ein oder wenige Verzeichnisse sind, warum haben Sie dann keine Aliasnamen in Ihrem Bashrc oder irgendwelchen Init-Dateien? Zum Beispiel:

alias abc='cd /tmp/"a b c"'

Wenn du dann reingehen willst, gib einfach abc

ein     
Hopping Bunny 14.08.2015 03:34

Tags und Links