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


8

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

So che Linux ha un identificatore univoco per ogni particolare file. Posso usarlo per accedere alla cartella? Non so se questo possa 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 c'è qualche altro identificatore univoco (forse alcuni numeri memorizzati "sotto il cofano")?

Prova a pensare a questo come a un processo. Se si esegue il comando pssu un terminale, viene generato un elenco di processi con il nome e il numero di ciascun processo. Devi chiamare quel processo con il numero di processo. Allo stesso modo, esiste un numero per una directory in modo da poter chiamare la directory con il suo numero invece di chiamarla con il suo nome?


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


1
anche i caratteri jolly funzionano. altrimenti installa zshinvece dibash
Rinzwind l'

Ok, i caratteri jolly non sono la risposta che cerco. bisogno di pensare a zsh
Maruf

Devi accedere a una directory del genere o ce ne sono più?
Sergiy Kolodyazhnyy,

Aggiungi la tua soluzione (che potrebbe essere interessante tra l'altro) come risposta invece di aggiungerla alla tua domanda. Ecco a cosa servono le risposte!
kos,

Crea quel programma semplicemente stampa il percorso e fai un cd $(icd XXXX)--- hai appena riscritto quella findparte. Ora il tuo prossimo compito è ... controlla cosa è più efficiente, il tuo programma o find:-P.
Rmano,

Risposte:


2

Soluzione realizzata dall'OP

Nessun comando incorporato 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 pubblicando il codice non elaborato.

Ma c'è un problema fondamentale che ho affrontato qui. Durante l'esecuzione del codice, è necessario un codice C da un bash per creare un processo figlio sotto il processo bash (processo parent). Dal processo figlio lo spazio della directory è nuovo e non posso accedere allo spazio della directory del processo parent da lì. Quindi nulla potrebbe essere fatto se non invocato una nuova finestra bash da qui. In futuro proverò ad implementare una nuova funzionalità di scheda se le persone sono interessate a questo. Ma credo di aver affrontato molte critiche per questo. Quindi le persone potrebbero non essere interessate. Ho appena fatto per il mio divertimento.

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 verrà modificato.


1
Se potessi spostarti in una directory all'interno di uno script di shell, puoi procurarti lo script per ottenere ciò che desideri. Definire un alias per abbreviare il comando.
daltonfury42,

19

Qualsiasi entità nei (più) file system su Linux ha un identificatore univoco chiamato an inode. Si noti che un file può avere più di un nome ( hardlink ), ma le directory hanno un solo link in tutti i filesystem che conosco. Si noti che il concetto di inode è locale nel filesystem, in modo che in due diversi dispositivi (partizione o altro) l'unicità non sia 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 l'inode 20873234. Ora puoi passare ad essa con il comando:

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

(Si noti che 2> /dev/nullè quello di chiudere i messaggi di errore su directory illeggibili lungo il percorso.)

Questo comando eseguirà la scansione dell'intera directory home, quindi sii paziente. 1

Ma per quanto riguarda l'utilizzo cde il completamento TAB della shell?


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

2. Bene, puoi peggiorare le cose scansionando da/. 3

3. Ma allora non funzionerà, perché gli inode sono unici solo su base per filesystem (per mount).


Grazie @Romano. In realtà stavo pensando al problema. Non so che il problema si trasformerebbe in una soluzione così inefficiente. Ma pensa alla soluzione. Puoi facilmente scrivere un programma ac e inserirlo in / bin e quindi provare a eseguirlo con l'unico numero di inode. Pubblicherò il codice se sono in grado di scrivere tale pensare.
Maruf,

1
e anche uno pensa che devo sapere. Capisco la prima parte di questo comando. "$ (trova ~ -inum 20873234 ******)". ma non so perché stai scrivendo questo, "2> / dev / null". Potete chiarire ancora una volta.
Maruf,

4
@Maruf, non funzionerà, dal punto di vista dell'efficienza. La "chiave primaria" in base al quale è stato ottimizzato l'accesso a un file o una directory, veloce e diretto è, indovinate un po ', il percorso ... /dir/dir/file_or_dir. Il tuo programma C dovrà scansionare anche il filesystem ed findè stato ottimizzato negli ultimi 40 anni ... ancora --- perché? Se è necessario un collegamento, utilizzare a="/my/really/strange and long/dir path name/"e quindi cd "$a". Non posso batterlo. Oppure usa i collegamenti simbolici.
Rmano,

1
Uno buono +1. Ero sul punto di scrivere qualcosa di simile, ma ero troppo pigro, poiché il compito non ha alcun senso. @Rmano
Pilot6

3
@Rmano Aggiungo che in generale, anche su un singolo filesystem, potrebbero esserci diversi file che hanno lo stesso inode, cioè hardlink. Dal momento che stiamo parlando di directory qui, è vero che ogni directory ha un inode univoco (le directory non possono essere hardlinkate). Inoltre, penso che il motivo per cui non si possa accedere direttamente a un file tramite il suo inode è che questo ignorerebbe qualsiasi directory attraversamento, necessario per determinare se un utente è autorizzato ad accedere alla risorsa corrispondente. (Quindi se una directory fosse accessibile dal suo inode, allora il kernel dovrebbe comunque determinare il suo percorso.)
Malte Skoruppa

8

Puoi fare Tabruotare le cartelle disponibili invece di elencarle. Modifica il file ~/.inputrce aggiungi

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

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

Premi Ctrl+ xe Ctrl+ rper renderlo efficace.

Ora usa cdTabper navigare nella tua cartella senza scrivere il suo nome. cdShift+ Tabruoterà nell'altra direzione.

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


Questa è una buona risposta Puoi farlo visualizzare una volta e quindi ruotare?
daltonfury42,

1
Puoi assegnarlo a un altro collegamento. Uso Eclipse e sono abituato a Ctrl + spazio per il completamento automatico, quindi uso "\ C-": menu-complete invece, lasciando la scheda così com'è.
Katu,

5

È possibile utilizzare i caratteri jolly della shell.

Ad esempio, posso fare

cd a?b?c?d

o

cd a\*b\*c\*d

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

Se hai entrambi a b c de a1b2c3d, allora cd a?b?c?dsi espanderà in uno cd a1b2c3d a b c do cd a b c d a1b2c3d(l'ordine effettivo dipenderà dal kernel, dal filesystem ...) e bash ti sposterà silenziosamente sul primo percorso.

D'altra parte, spesso non hai cartelle con nomi simili, quindi qualcosa di simile a*dè sufficiente per espanderlo senza dover digitare tutti i caratteri intermedi. Ciò è particolarmente utile quando in realtà non si è in grado di digitarlo (ad es. I nomi sono in uno script diverso, o anche una codifica diversa), e altrimenti sarebbe necessario codificare in ottale il nome del file.


3

Puoi trovare questa directory in un file manager, ad es. Nautilus e trascinarla sul terminale.

Se in precedenza hai digitato il cdterminale, otterrai il comando.


In realtà sto provando a fare tutto dal terminale. :). Quindi non c'è bisogno di pensare a nautilus. Penso che ci debba essere una procedura per accedere al file. Poiché Linux salva sempre un identificatore univoco per un determinato file. Ma non so come farlo o è possibile farlo.
Maruf,

Non è chiaro quello che chiedi. Non è possibile passare a una directory non inserendo il suo nome in qualche modo.
Pilota

Vedi la dichiarazione. L'ho aggiornato.
Maruf,

O se questo è il problema con un singolo file, è possibile aggiungere un alias.
daltonfury42,

1

Non sono sicuro che sia esattamente quello che stai chiedendo, ma zshha alcuni trucchi per accedere a una directory con altri mezzi oltre a digitare il nome rigoroso della directory; per uno, puoi digitare una parte del nome e si espanderà al nome completo della directory, il che consente cose molto utili, ad esempio:

inserisci qui la descrizione dell'immagine

Colpire TAB...

inserisci qui la descrizione dell'immagine


1

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

Uso sempre questa procedura e non si limita solo ai nomi di directory. Può essere utilizzato per qualsiasi comando utilizzando la riga di comando.

In bocca al lupo.


Questo non sfuggirà ai personaggi speciali
Scz,

1

Se è solo una o poche directory, perché non avere alias nel tuo bashrc o qualunque file init? Per esempio:

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

Quindi ogni volta che vuoi andare lì, basta digitare abc


0

È possibile scrivere un programma per creare una tabella hash per tutte le directory del sistema operativo. Fondamentalmente sarebbe un programma di appiattimento degli alberi.

Ma poi potresti fare qualcosa del genere hash-cd 32okjv02e farebbe la ricerca della tabella hash per il 32okjv02mapping della directory to. e passa alla tua directory. E sarebbe davvero veloce una volta che avessi indicizzato tutte le tue directory.

Dovresti alias mkdir per chiamare questo programma ogni nuova directory e magari scrivere un comando check / refresh della tabella hash che potresti cron ogni minuto e all'accesso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.