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

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

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

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

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


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

9 ответов

Решение

Решение от OP

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

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

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 ;

}

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

Любая сущность в (большинстве) файловых систем в Linux имеет уникальный идентификатор, называемый 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. Это, должно быть, самая неэффективная вещь, которую я когда-либо писал... ода энтропии. Причина в том, что "первичный ключ", по которому доступ к файлу или каталогу оптимизирован, быстрый и прямой, - угадайте, что? - путь: /dir/dir/file_or_dir, Более того, чтобы предоставить вам доступ к определенному каталогу, система должна проверить все разрешения в пути... так что, опять же, доступ через inode означает рекурсивное сканирование файловой системы.

2. Ну, вы можете сделать хуже, отсканировав /, 3

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

Вы можете заставить Tab вращать доступные папки вместо того, чтобы перечислять их. Редактировать файл ~/.inputrc и добавить

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

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

Нажмите Ctrl + x и Ctrl + r, чтобы сделать его эффективным.

Сейчас использую cdВкладка для навигации по вашей папке без написания ее имени. cdShift + Tab будет вращаться в другом направлении.

Стоит помнить, что cd - перенесет вас в последнюю посещенную папку.

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

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

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 (фактический порядок будет зависеть от ядра, файловой системы...), и bash молча перенесет вас на первый путь.

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

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

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

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

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

Удачи.

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

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

Тогда всякий раз, когда вы хотите пойти туда, просто введите abc

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

Ударив TAB...

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

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

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

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