Иногда раздражает доступ к каталогу с именем папки. Скажем, у меня есть каталог с именем a b c d
. Кроме использования Tab kbd>, есть ли способ получить доступ к папке без ввода имени каталога?
Я знаю, что у Linux есть уникальный идентификатор для каждого конкретного файла. Могу ли я использовать это для доступа к папке? Я не знаю, можно ли это сделать на самом деле или как это сделать.
Я думаю, что когда Linux реализует файловую систему, он сравнивает уникальность двух имен каталогов. Таким образом, каждый каталог должен быть уникальным в пространстве. Но я думаю, что это как первичный ключ в системе баз данных. Является ли первичный ключ именем каталога или есть какой-то другой уникальный идентификатор (возможно, некоторые числа хранятся «под капотом»)?
Попробуйте представить это как процесс. Если вы выполняете команду ps
на терминале, он выводит список процессов с именем и номером каждого процесса. Вы должны вызвать этот процесс с номером процесса. Точно так же, есть ли номер для каталога, чтобы вы могли вызывать каталог с его номером вместо того, чтобы называть его по имени?
При дальнейшем исследовании я обнаружил, что у каждого каталога есть уникальный inode
. Однако до сих пор я не нашел ни одной встроенной команды для доступа к каталогу с помощью inode
.
Никакая встроенная команда не найдена здесь. Но наконец я могу записать, программа 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 ;
}
Я использую терминал гнома здесь. Очевидно, Для другого дистрибутива код будет изменен.
Можно использовать подстановочные знаки оболочки.
, Например, я могу сделать
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
достаточно для расширения этого, не имея необходимость вводить все промежуточные символы. Это специально полезно, когда Вы на самом деле не можете ввести его (например, имена находятся в другом сценарии или даже другом кодировании), и Вам иначе было бы нужно к восьмеричному - кодируют имя файла.
Любой объект в (большинстве) файловые системы на 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 уникальны только на на файловую систему (пермаунт) основание.
Можно сделать Вкладку , поворачивают доступные папки вместо того, чтобы перечислить их. Отредактируйте файл ~/.inputrc
и добавьте
"\C-i": menu-complete
"\e[Z": "\e-1\C-i"
, Если Вы хотите его для всех пользователей, редактируете /etc/inputrc
вместо этого.
Нажатие Ctrl + x и Ctrl + r для создания этого эффективным.
Теперь использование cd
Вкладка для навигации к папке, не написав ее имя. cd
Сдвиг + Вкладка будет вращаться в другом направлении.
Стоящий запоминания, что cd -
возьмет Вас к последней посещаемой папке.
Если это - всего один или несколько каталогов, почему бы не псевдонимы в Вашем bashrc или безотносительно init файлы? Например:
alias abc='cd /tmp/"a b c"'
Затем каждый раз, когда Вы хотите пойти туда, просто тип abc
Не уверенный, если это точно, что Ваша просьба о, но zsh
имеет некоторые аккуратные приемы для доступа к каталогу другими средствами, чем введение строгого имени каталога; для одного можно ввести часть имени, и оно расширится до полного имени каталога, которое допускает очень полезные вещи, например:
Удар ВКЛАДКА ...
Можно найти этот каталог в файловом менеджере, например, наутилус и просто перетащить его к терминалу.
, Если Вы ранее тип cd
в терминале, Вы получите команду.
Самый простой путь состоит в том, чтобы дважды щелкнуть по имени каталога (предполагающий, что это видимо на экране), затем введите CD, сопровождаемый пространством, и нажмите кнопку колеса на Вашей мыши, и это скопирует и вставит имя каталога, которое Вы выделили. Нажатие клавиши Enter затем изменится на требуемый каталог.
я использую эту процедуру все время, и она только ограничена именами каталогов. Это может использоваться для любых команд с помощью командной строки.
Удача.
Вы могли записать программу для создания хеш-таблицы для всех каталогов OS. Это в основном была бы программа выравнивания дерева.
Но затем Вы могли сделать что-то как hash-cd 32okjv02
и это сделало бы поиск хеш-таблицы для 32okjv02
к отображению каталога. и переход к Вашему каталогу. И это было бы действительно быстро, после того как Вы получили все свои индексированные каталоги.
Необходимо было бы исказить mkdir, чтобы назвать эту программу каждым новым каталогом и возможно записать, что проверка/обновление хеш-таблицы управляет, чтобы Вы могли крон каждую минуту и на входе в систему.