Как я могу перейти в каталог без записи его имени?
Иногда раздражает доступ к каталогу с именем папки. Скажем, у меня есть каталог с именем 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
Вкладка для навигации по вашей папке без написания ее имени. cd
Shift + 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 для вызова этой программы в каждом новом каталоге и, возможно, написать команду проверки / обновления хеш-таблицы, которую вы могли бы выполнять каждую минуту и при входе в систему.