Come posso effettuare il cd in una directory senza scrivere il suo nome?

8

A volte è fastidioso accedere a una directory con il nome della cartella. Supponiamo che abbia una directory denominata a b c d . Oltre all'utilizzo della Tab , esiste un modo per accedere alla cartella senza digitare il nome della directory?

So che Linux ha un identificatore univoco su ogni file particolare. Posso usare questo per accedere alla cartella? Non so se questo può essere effettivamente fatto o come farlo.

Penso che quando Linux implementa un filesystem, confronta l'unicità di due nomi di directory. Quindi ogni directory deve essere unica in uno spazio. Ma penso che sia come una chiave primaria in un sistema di database. La chiave primaria è il nome della directory o ci sono altri identificatori univoci (forse alcuni numeri memorizzati "sotto il cofano")?

Prova a pensare a questo come a un processo. Se si esegue il comando ps su un terminale, viene generata una lista di processi con il nome e il numero di ciascun processo. Devi chiamare quel processo con il numero del processo. Allo stesso modo, c'è un numero per una directory in modo che tu possa chiamare la directory con il suo numero invece di chiamarla con il suo nome?

Su ulteriori indagini, ho trovato che ogni directory ha un inode unico. Tuttavia, non ho trovato alcun comando incorporato per accedere a una directory con il suo inode .

    
posta Maruf 08.08.2015 - 15:58

9 risposte

2

Soluzione fatta da OP

Nessun comando integrato trovato qui. Ma finalmente sono in grado di scrivere un programma C per usare cd (chiamiamo il mio programma icd == (inode cd)) per entrare in una cartella usando il valore inode. Qui sto postando il codice raw.

Ma c'è un problema fondamentale che ho affrontato qui. Mentre eseguiva la codifica, un codice C da bash era necessario per creare un processo figlio sotto il processo bash (processo genitore). Dal processo figlio lo spazio della directory è nuovo e da lì non posso accedere allo spazio della directory del processo genitore. Quindi non si poteva fare nulla, tranne invocare una nuova finestra bash da qui. In futuro cercherò di implementare una nuova funzionalità di tabulazione se le persone sono interessate a questo. Ma credo di aver affrontato molte critiche per averlo fatto. Quindi le persone potrebbero non essere interessate. Ho appena finito di divertirmi.

Il codice RAW è condiviso qui,

#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 ;

}

Sto usando il terminale gnome qui. Ovviamente per altre distro il codice sarà cambiato.

    
risposta data Pilot6 11.08.2015 - 17:23
19

Qualsiasi entità in (la maggior parte) file system su Linux ha un identificatore univoco chiamato inode . Si noti che un file può avere più di un nome ( hardlink ), ma le directory hanno solo un collegamento in tutti i filesystem che conosco di. Si noti che il concetto di inode è local nel filesystem, così che in due dispositivi diversi (partizione o altro) l'unicità non è garantita.

Puoi vedere l'inode della tua directory con ls -ldi :

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

Quindi sai che la tua directory ha inode 20873234. Ora puoi passare ad essa con il comando:

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

(Tieni presente che 2> /dev/null deve chiudere i messaggi di errore relativi alle directory illeggibili lungo il percorso.)

Questo comando analizzerà l'intera directory home, quindi sii paziente. 1

Ma per quanto riguarda l'utilizzo di cd e il completamento della TAB della shell?

1. Questa è la cosa più inefficiente 2 che abbia mai pubblicato ... un'ode all'entropia. Il motivo è che la "chiave primaria" in base alla quale l'accesso a un file o a una directory è ottimizzata, veloce e diretta è - indovina un po '? - il nome del percorso: /dir/dir/file_or_dir . Inoltre, per garantire l'accesso a una determinata directory, il sistema deve controllare tutte le autorizzazioni nel percorso ... quindi, di nuovo, l'accesso per inode significa scansionare ricorsivamente il filesystem.

2. Bene, puoi peggiorare la situazione eseguendo la scansione da / . 3

3. Ma non funzionerà, perché gli inode sono unici solo su una base per file system (per montaggio).

    
risposta data Rmano 08.08.2015 - 17:00
7

Puoi fare in modo che Tab ruoti le cartelle disponibili invece di elencarle. Modifica il file ~/.inputrc e aggiungi

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

Se lo desideri per tutti gli utenti, modifica /etc/inputrc invece.

Premi Ctrl + x e Ctrl + r per renderlo efficace.

Adesso usa cd Tab per navigare nella tua cartella senza scrivere il suo nome. cd Shift + Tab ruoterà nell'altra direzione.

Vale la pena ricordare che cd - ti porterà all'ultima cartella visitata.

    
risposta data Katu 09.08.2015 - 00:06
5

Puoi usare i caratteri jolly della shell.

Ad esempio, posso fare

cd a?b?c?d

o

cd a\*b\*c\*d

Ed espanderà i caratteri jolly sul nome effettivo e cambierà in quella directory. Supponendo che sia l'unica directory che corrisponde.

Se hai sia a b c d che a1b2c3d , allora cd a?b?c?d si espanderà a cd a1b2c3d a b c d o cd a b c d a1b2c3d (l'ordine effettivo dipenderà dal kernel, dal filesystem ...), e bash silenziosamente vai al primo percorso.

D'altra parte, spesso non si hanno cartelle con nomi simili, quindi qualcosa come a*d è sufficiente per espandersi senza dover digitare tutti i caratteri intermedi. Questo è particolarmente utile quando non si è in grado di scriverlo (ad esempio i nomi sono in uno script diverso o anche in una codifica diversa), e altrimenti avresti avuto bisogno di codificare ottale il nome del file.

    
risposta data Ángel 08.08.2015 - 23:52
3

Puoi trovare questa directory in un file manager, ad es. nautilus e basta trascinarlo sul terminale.

Se scrivi in ​​precedenza cd nel terminale, otterrai il comando.

    
risposta data Pilot6 08.08.2015 - 16:04
1

Non sei sicuro che sia esattamente ciò che stai chiedendo, ma zsh ha alcuni trucchetti per accedere a una directory con altri mezzi piuttosto che digitare il nome stretto della directory; per esempio, è possibile digitare una parte del nome e si espanderà al nome completo della directory, il che consente di fare cose molto utili, ad esempio:

Colpire TAB ...

    
risposta data kos 08.08.2015 - 17:53
1

Il modo più semplice è di fare doppio clic sul nome della directory (supponendo che sia visibile sullo schermo), quindi digitare cd seguito da spazio e fare clic sul pulsante rotellina del mouse per copiare e incollare il nome della directory che si ha evidenziato. Premendo il tasto Invio si passa quindi alla directory richiesta.

Uso sempre questa procedura e non si limita ai nomi delle directory. Può essere usato per qualsiasi comando usando la linea di comando.

Buona fortuna.

    
risposta data Allen 13.08.2015 - 00:01
1

Se è solo una o poche directory, perché non hai alias nel tuo bashrc o in qualunque altro file di init? Ad esempio:

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

Quindi, ogni volta che vuoi entrare, digita abc

    
risposta data Hopping Bunny 14.08.2015 - 03:34
0

Potresti scrivere un programma per creare una tabella hash per tutte le tue directory SO. Sarebbe fondamentalmente un programma di appiattimento degli alberi.

Ma potreste fare qualcosa come hash-cd 32okjv02 e farebbe la ricerca della tabella hash per il 32okjv02 alla mappatura della directory. e vai alla tua directory. E sarebbe molto veloce una volta che hai indicizzato tutte le tue directory.

Dovresti alias mkdir per chiamare questo programma ogni nuova directory e magari scrivere un comando di controllo / aggiornamento della tabella hash che puoi cron ogni minuto e all'accesso.

    
risposta data Nick Kiermaier 24.08.2018 - 02:48

Leggi altre domande sui tag