Как я могу перейти в каталог без записи его имени?

Иногда раздражает доступ к каталогу с именем папки. Скажем, у меня есть каталог с именем a b c d. Кроме использования Tab , есть ли способ получить доступ к папке без ввода имени каталога?

Я знаю, что у Linux есть уникальный идентификатор для каждого конкретного файла. Могу ли я использовать это для доступа к папке? Я не знаю, можно ли это сделать на самом деле или как это сделать.

Я думаю, что когда Linux реализует файловую систему, он сравнивает уникальность двух имен каталогов. Таким образом, каждый каталог должен быть уникальным в пространстве. Но я думаю, что это как первичный ключ в системе баз данных. Является ли первичный ключ именем каталога или есть какой-то другой уникальный идентификатор (возможно, некоторые числа хранятся «под капотом»)?

Попробуйте представить это как процесс. Если вы выполняете команду ps на терминале, он выводит список процессов с именем и номером каждого процесса. Вы должны вызвать этот процесс с номером процесса. Точно так же, есть ли номер для каталога, чтобы вы могли вызывать каталог с его номером вместо того, чтобы называть его по имени?


При дальнейшем исследовании я обнаружил, что у каждого каталога есть уникальный inode. Однако до сих пор я не нашел ни одной встроенной команды для доступа к каталогу с помощью inode.

8
задан 12 October 2017 в 08:09

9 ответов

Решение сделано OP

Никакая встроенная команда не найдена здесь. Но наконец я могу записать, программа C для использования CD (позволяет, называют мою программу icd == (inode CD)) войти в папку с помощью inode значение. Здесь я отправляю необработанный код.

Но существует фундаментальная проблема, с которой я столкнулся здесь. При кодировании выполнения код C от удара должен был создать дочерний процесс при процессе удара (родительский процесс). От дочернего процесса пространство для каталога является новым, и я не могу получить доступ к пространству для каталога родительского процесса оттуда. Таким образом, ничто не могло быть сделано кроме вызванного новое окно удара отсюда. В будущем я попытаюсь реализовать функцию new tab, если люди будут интересоваться этим. Но я полагаю, что столкнулся с большой критикой за то, что сделали это. Таким образом, людям не могло бы быть интересно. Я только что сделал для своего развлечения.

НЕОБРАБОТАННЫЙ код совместно используется здесь,

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

}

Я использую терминал гнома здесь. Очевидно, Для другого дистрибутива код будет изменен.

2
ответ дан 12 October 2017 в 18:09

Можно использовать подстановочные знаки оболочки.

, Например, я могу сделать

cd a?b?c?d

или

cd a\*b\*c\*d

, И это развернет подстановочные знаки до подлинного имени и изменение в том каталоге. Принятие это - единственный каталог, который соответствует.

, Если Вы имеете и a b c d и a1b2c3d, затем cd a?b?c?d, расширится или до cd a1b2c3d a b c d или до cd a b c d a1b2c3d (фактический порядок будет зависеть от ядра, файловая система...), и удар тихо переместит Вас в первый путь.

, С другой стороны, Вы часто не так так же называли папки, таким образом, чего-то как a*d достаточно для расширения этого, не имея необходимость вводить все промежуточные символы. Это специально полезно, когда Вы на самом деле не можете ввести его (например, имена находятся в другом сценарии или даже другом кодировании), и Вам иначе было бы нужно к восьмеричному - кодируют имя файла.

5
ответ дан 12 October 2017 в 18:09

Любой объект в (большинстве) файловые системы на Linux имеет уникальный идентификатор, названный inode. Заметьте, что файл может иметь больше чем одно имя ( hardlink), но каталоги имеют всего одну ссылку во всех файловых системах, о которых я знаю. Заметьте, что понятие inode локально к файловой системе, так, чтобы в двух различных устройствах (раздел или безотносительно) уникальность не была гарантирована.

Вы видите inode своего каталога с ls -ldi:

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

, Таким образом, Вы знаете, что Ваш каталог имеет inode 20873234. Теперь можно переключиться на него с командой:

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

(Отмечают, что эти 2> /dev/null должен закрыть сообщения об ошибках о нечитабельных каталогах вдоль пути.)

Эта команда просканирует полноту Вашего корневого каталога, так будет терпелива. <глоток> 1

, Но что относительно того, чтобы использовать cd и заполнение клавишей Tab Вашей оболочки?

<час>

<глоток> 1. Это должно быть большинством <глоток> 2 неэффективная вещь, я когда-либо отправлял... оду на энтропию. Причина состоит в том, что “primary key”, под которым доступ к файлу или каталогу оптимизирован, быстр и прямой, является — предположение что? — путь: /dir/dir/file_or_dir. Кроме того, для предоставления Вы получаете доступ к данному каталогу, система должна проверить, что все полномочия в пути... поэтому снова, получая доступ inode означают сканировать рекурсивно файловую систему.

<глоток> 2. ну, можно сделать вещь хуже путем сканирования от /. <глоток> 3

<глоток> 3. , Но затем это не будет работать, потому что inodes уникальны только на на файловую систему (пермаунт) основание.

19
ответ дан 12 October 2017 в 18:09

Можно сделать Вкладку , поворачивают доступные папки вместо того, чтобы перечислить их. Отредактируйте файл ~/.inputrc и добавьте

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

, Если Вы хотите его для всех пользователей, редактируете /etc/inputrc вместо этого.

Нажатие Ctrl + x и Ctrl + r для создания этого эффективным.

Теперь использование cd Вкладка для навигации к папке, не написав ее имя. cd Сдвиг + Вкладка будет вращаться в другом направлении.

Стоящий запоминания, что cd - возьмет Вас к последней посещаемой папке.

8
ответ дан 12 October 2017 в 18:09

Если это - всего один или несколько каталогов, почему бы не псевдонимы в Вашем bashrc или безотносительно init файлы? Например:

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

Затем каждый раз, когда Вы хотите пойти туда, просто тип abc

1
ответ дан 12 October 2017 в 18:09

Не уверенный, если это точно, что Ваша просьба о, но zsh имеет некоторые аккуратные приемы для доступа к каталогу другими средствами, чем введение строгого имени каталога; для одного можно ввести часть имени, и оно расширится до полного имени каталога, которое допускает очень полезные вещи, например:

enter image description here

Удар ВКЛАДКА ...

enter image description here

1
ответ дан 12 October 2017 в 18:09

Можно найти этот каталог в файловом менеджере, например, наутилус и просто перетащить его к терминалу.

, Если Вы ранее тип cd в терминале, Вы получите команду.

3
ответ дан 12 October 2017 в 18:09

Самый простой путь состоит в том, чтобы дважды щелкнуть по имени каталога (предполагающий, что это видимо на экране), затем введите CD, сопровождаемый пространством, и нажмите кнопку колеса на Вашей мыши, и это скопирует и вставит имя каталога, которое Вы выделили. Нажатие клавиши Enter затем изменится на требуемый каталог.

я использую эту процедуру все время, и она только ограничена именами каталогов. Это может использоваться для любых команд с помощью командной строки.

Удача.

1
ответ дан 12 October 2017 в 18:09

Вы могли записать программу для создания хеш-таблицы для всех каталогов OS. Это в основном была бы программа выравнивания дерева.

Но затем Вы могли сделать что-то как hash-cd 32okjv02 и это сделало бы поиск хеш-таблицы для 32okjv02 к отображению каталога. и переход к Вашему каталогу. И это было бы действительно быстро, после того как Вы получили все свои индексированные каталоги.

Необходимо было бы исказить mkdir, чтобы назвать эту программу каждым новым каталогом и возможно записать, что проверка/обновление хеш-таблицы управляет, чтобы Вы могли крон каждую минуту и на входе в систему.

0
ответ дан 23 November 2019 в 05:21

Другие вопросы по тегам:

Похожие вопросы: