Jak mogę cd do katalogu bez zapisywania jego nazwy?

8

Czasami denerwujące jest uzyskanie dostępu do katalogu z nazwą folderu. Powiedz, że mam katalog o nazwie a b c d. Czy oprócz użycia Tabjest jakiś sposób na uzyskanie dostępu do folderu bez wpisywania nazwy katalogu?

Wiem, że Linux ma unikalny identyfikator każdego konkretnego pliku. Czy mogę tego użyć, aby uzyskać dostęp do folderu? Nie wiem, czy da się to właściwie zrobić, ani jak to zrobić.

Myślę, że kiedy Linux implementuje system plików, porównuje unikalność dwóch nazw katalogów. Dlatego każdy katalog musi być unikalny w spacji. Ale myślę, że to jest jak klucz podstawowy w systemie baz danych. Czy klucz podstawowy to nazwa katalogu, czy istnieje jakiś inny unikalny identyfikator (być może niektóre liczby przechowywane „pod maską”)?

Spróbuj myśleć o tym jak o procesie. Wykonanie polecenia psna terminalu powoduje wyświetlenie listy procesów z nazwą i numerem każdego procesu. Musisz wywołać ten proces za pomocą numeru procesu. Podobnie, czy istnieje numer dla katalogu, aby można było wywołać katalog z jego numerem zamiast wywoływać go z jego nazwą?


Po dalszym dochodzeniu odkryłem, że każdy katalog ma unikalny inode. Jednak jak dotąd nie znalazłem żadnego wbudowanego polecenia dostępu do katalogu inode.

Maruf
źródło
1
działają również symbole wieloznaczne. w przeciwnym razie zainstaluj zshzamiastbash
Rinzwind
Ok, symbole wieloznaczne nie są odpowiedzią, której szukam. muszę pomyśleć o zsh
Maruf
Potrzebujesz dostępu do jednego takiego katalogu, czy istnieje wiele?
Sergiy Kolodyazhnyy
Dodaj swoje rozwiązanie (które może być interesujące) jako odpowiedź zamiast dodawać je do pytania. Po to są odpowiedzi!
Kos
Niech ten program po prostu wydrukuje ścieżkę i zrób cd $(icd XXXX)--- po prostu przepisałeś tę findczęść. Teraz Twoim kolejnym zadaniem jest ... sprawdzenie, co jest bardziej wydajne, programu lub find:-P.
Rmano

Odpowiedzi:

2

Rozwiązanie wykonane przez OP

Nie znaleziono tu wbudowanego polecenia. Ale w końcu jestem w stanie napisać program C do korzystania z cd (wywołaj mój program icd == (inode cd)), aby wejść do folderu przy użyciu wartości i-węzła. Tutaj zamieszczam surowy kod.

Ale tutaj mam do czynienia z podstawowym problemem. Podczas kodowania wykonanie kodu C z bash potrzebnego do utworzenia procesu potomnego w ramach procesu bash (proces nadrzędny). W procesie potomnym przestrzeń katalogu jest nowa i nie mogę uzyskać dostępu do przestrzeni katalogu procesu nadrzędnego. Nic więc nie da się zrobić poza wywołaniem nowego okna bash. W przyszłości postaram się wdrożyć nową funkcję karty, jeśli ludzie będą to zainteresowani. Ale wierzę, że spotkałem się z dużą krytyką za to. Więc ludzie mogą nie być zainteresowani. Właśnie zrobiłem to dla mojej rozrywki.

Udostępniono tutaj kod RAW,

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

}

Używam tutaj terminalu gnome. Oczywiście w przypadku innych dystrybucji kod zostanie zmieniony.

Pilot 6
źródło
1
Jeśli możesz przejść do katalogu w skrypcie powłoki, możesz uzyskać skrypt w celu osiągnięcia tego, co chcesz. Zdefiniuj alias, aby skrócić polecenie.
daltonfury42,
19

Każda jednostka w (większości) systemach plików w systemie Linux ma unikalny identyfikator o nazwie inode. Zauważ, że plik może mieć więcej niż jedną nazwę ( hardlink ), ale katalogi mają tylko jedno łącze we wszystkich systemach plików, które znam. Zauważ, że koncepcja i-węzła jest lokalna dla systemu plików, więc w dwóch różnych urządzeniach (partycji lub czymkolwiek) unikalność nie jest gwarantowana.

Możesz zobaczyć i-węzeł swojego katalogu za pomocą ls -ldi:

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

Więc wiesz, że twój katalog ma i-węzeł 20873234. Teraz możesz przejść do niego za pomocą polecenia:

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

(Należy pamiętać, że 2> /dev/nullma to na celu zamknięcie komunikatów o błędach dotyczących nieczytelnych katalogów na ścieżce).

To polecenie przeskanuje cały katalog domowy, więc bądź cierpliwy. 1

Ale co z używaniem cdi uzupełnianiem TAB twojej powłoki?


1. To musi być najbardziej 2 nieefektywne rzeczą, jaką kiedykolwiek pisał ... odą do entropii. Powodem jest to, że „klucz podstawowy”, pod którym dostęp do pliku lub katalogu jest zoptymalizowany, szybki i bezpośredni to - zgadnij co? - nazwa ścieżki:/dir/dir/file_or_dir. Co więcej, aby zapewnić ci dostęp do danego katalogu, system musi sprawdzić wszystkie uprawnienia na ścieżce ... tak więc dostęp przez i-węzeł oznacza skanowanie rekursywne systemu plików.

2. Cóż, możesz pogorszyć sytuację, skanując z/. 3)

3. Ale to nie zadziała, ponieważ i-węzły są unikalne tylko dla systemu plików (dla montowania).

Rmano
źródło
Dzięki @Romano. Właściwie to myślałem o problemie. Nie wiem, czy problem stałby się tak nieefektywnym rozwiązaniem. Ale pomyśl o rozwiązaniu. Możesz łatwo napisać program ac i umieścić go w / bin, a następnie spróbować uruchomić go z jedynym numerem i-węzła. Wyślę kod, jeśli będę w stanie napisać taką myśl.
Maruf
1
a także jedna myśl, którą muszę wiedzieć. Rozumiem pierwszą część tego polecenia. „$ (znajdź ~ -inum 20873234 ******)”. ale nie wiem, dlaczego piszesz to „2> / dev / null”. Czy możesz wyjaśnić jeszcze raz.
Maruf
4
@Maruf, to nie będzie działać, pod względem wydajności. „Klucz podstawowy” w ramach którego dostęp do pliku lub katalogu jest zoptymalizowany, szybki i bezpośredni jest, wiecie co, ścieżkę ... /dir/dir/file_or_dir. Twój program C również będzie musiał przeskanować system plików i findzostał zoptymalizowany w ciągu ostatnich 40 lat ... wciąż --- dlaczego? Jeśli potrzebujesz skrótu, użyj, a="/my/really/strange and long/dir path name/"a następnie cd "$a". Nie mogę tego przebić. Lub użyj dowiązań symbolicznych.
Rmano,
1
Dobry +1. Byłem na skraju pisania czegoś podobnego, ale byłem zbyt leniwy, ponieważ zadanie nie ma żadnego sensu. @Rmano
Pilot6
3
@Rmano Dodałbym, że ogólnie, nawet na jednym systemie plików, może istnieć kilka plików, które mają ten sam i-węzeł, tj. Hardlink. Ponieważ mówimy tutaj o katalogach, prawdą jest, że każdy katalog ma unikalny i-węzeł (katalogów nie można połączyć na stałe). Myślę też, że powodem, dla którego nie można uzyskać bezpośredniego dostępu do pliku za pomocą jego i-węzła jest to, że omija on dowolny katalog przejście, potrzebne do ustalenia, czy użytkownik może uzyskać dostęp do odpowiedniego zasobu. (Jeśli więc dostęp do katalogu można uzyskać za pomocą jego i-węzła, jądro i tak będzie musiało określić swoją ścieżkę.)
Malte Skoruppa
8

Możesz Tabobrócić dostępne foldery zamiast je wyświetlać. Edytuj plik ~/.inputrci dodaj

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

Jeśli chcesz dla wszystkich użytkowników, edytuj /etc/inputrczamiast tego.

Naciśnij Ctrl+ xi Ctrl+, raby było skuteczne.

Teraz użyj, cdTababy przejść do folderu bez wpisywania jego nazwy. cdShift+ Tabobróci się w innym kierunku.

Warto pamiętać, że cd -zabierze Cię do ostatnio odwiedzanego folderu.

Katu
źródło
To dobra odpowiedź. Czy możesz sprawić, by wyświetlał się raz, a następnie obracał?
daltonfury42
1
Możesz przypisać to do innego skrótu. Używam Eclipse i jestem przyzwyczajony do Ctrl + spacja do automatycznego uzupełniania, więc używam „\ C-”: menu-kompletne, pozostawiając tabulację taką, jaka jest.
Katu,
5

Możesz używać symboli wieloznacznych powłoki.

Na przykład mogę

cd a?b?c?d

lub

cd a\*b\*c\*d

I rozszerzy symbole wieloznaczne do rzeczywistej nazwy i przejdzie do tego katalogu. Zakładając, że jest to jedyny zgodny katalog.

Jeśli masz zarówno a b c da a1b2c3d, a następnie cd a?b?c?dwzrośnie do jednej cd a1b2c3d a b c dlub cd a b c d a1b2c3d(rzeczywista kolejność zależy od jądra, systemu plików, ...), a bash będzie cicho przenieść się do pierwszej ścieżki.

Z drugiej strony często nie masz folderów o podobnej nazwie, więc a*dwystarczy coś takiego , aby je rozwinąć bez konieczności wpisywania wszystkich znaków pośrednich. Jest to szczególnie przydatne, gdy nie możesz go wpisać (np. Nazwy są w innym skrypcie, a nawet w innym kodowaniu), a w innym przypadku konieczne byłoby kodowanie ósemkowe nazwy pliku.

Anioł
źródło
3

Możesz znaleźć ten katalog w menedżerze plików, np. Nautilus, po prostu przeciągnij go i upuść na terminalu.

Jeśli wcześniej wpiszesz cdterminal, otrzymasz polecenie.

Pilot 6
źródło
Właściwie staram się robić wszystko od terminalu. :) Więc nie trzeba myśleć o nautilusie. Myślę, że musi istnieć procedura dostępu do pliku. Ponieważ Linux zawsze zapisuje unikalny identyfikator dla konkretnego pliku. Ale nie wiem, jak to zrobić, czy rzeczywiście można to zrobić.
Maruf
Nie jest jasne, o co pytasz. Nie można przejść do katalogu, który w jakiś sposób nie wprowadza swojej nazwy.
Pilot6
Zobacz oświadczenie. Zaktualizowałem to.
Maruf
Lub jeśli taki jest problem z pojedynczym plikiem, możesz dodać alias.
daltonfury42,
1

Nie jestem pewien, czy dokładnie o to prosisz, ale zshma kilka fajnych sztuczek, aby uzyskać dostęp do katalogu w inny sposób niż wpisanie ścisłej nazwy katalogu; po pierwsze możesz wpisać część nazwy, która zostanie rozwinięta do pełnej nazwy katalogu, co pozwala na bardzo przydatne rzeczy, na przykład:

wprowadź opis zdjęcia tutaj

Uderzenie TAB...

wprowadź opis zdjęcia tutaj

kos
źródło
1

Najprostszym sposobem jest dwukrotne kliknięcie nazwy katalogu (zakładając, że jest ona widoczna na ekranie), a następnie wpisz cd, a następnie spację i kliknij przycisk kółka myszy, a skopiuje i wklei podświetloną nazwę katalogu. Naciśnięcie klawisza enter spowoduje przejście do wymaganego katalogu.

Cały czas korzystam z tej procedury i nie ogranicza się ona tylko do nazw katalogów. Można go używać do dowolnych poleceń za pomocą wiersza poleceń.

Powodzenia.

Allen
źródło
Nie uniknie to znaków specjalnych
Scz
1

Jeśli jest to tylko jeden lub kilka katalogów, dlaczego nie mieć aliasów w twoim bashrc lub w jakimkolwiek pliku inicjującym? Na przykład:

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

Następnie, gdy chcesz tam wejść, po prostu wpisz abc

Hopping Bunny
źródło
0

Możesz napisać program do utworzenia tabeli skrótów dla wszystkich katalogów systemu operacyjnego. Byłby to w zasadzie program spłaszczania drzew.

Ale wtedy możesz zrobić coś podobnego hash-cd 32okjv02i przeszuka tablicę skrótów w 32okjv02celu mapowania do katalogu. i przejdź do swojego katalogu. I byłoby naprawdę szybko, gdy indeksujesz wszystkie katalogi.

Będziesz musiał użyć aliasu mkdir, aby wywoływać ten program w każdym nowym katalogu, a może napiszesz polecenie sprawdzania / odświeżania tabeli skrótów, które możesz cron co minutę i przy logowaniu.

mutant_city
źródło