때로는 폴더 이름으로 디렉토리에 액세스하는 것이 성가시다. 라는 디렉토리가 있다고 가정 해보십시오 a b c d
. 를 사용하는 것 외에도 Tab디렉토리 이름을 입력하지 않고 폴더에 액세스 할 수있는 방법이 있습니까?
Linux에는 특정 파일마다 고유 식별자가 있다는 것을 알고 있습니다. 이것을 사용하여 폴더에 액세스 할 수 있습니까? 이것이 실제로 이루어질 수 있는지 또는 어떻게 해야하는지 모르겠습니다.
리눅스가 파일 시스템을 구현할 때 두 디렉토리 이름의 고유성을 비교한다고 생각합니다. 따라서 각 디렉토리는 공간에서 고유해야합니다. 그러나 데이터베이스 시스템의 기본 키와 같다고 생각합니다. 기본 키가 디렉토리 의 이름 입니까 아니면 다른 고유 식별자가 있습니까 (아마도 일부 숫자는 “후드”아래에 저장되어 있습니까)?
이것을 프로세스처럼 생각하십시오. ps
터미널 에서 명령을 실행하면 각 프로세스의 이름과 번호가 포함 된 프로세스 목록이 출력됩니다. 프로세스 번호로 해당 프로세스를 호출해야합니다. 마찬가지로 디렉토리 번호가 있습니까? 따라서 이름으로 전화하는 대신 번호로 디렉토리를 호출 할 수 있습니까?
추가 조사에서 각 디렉토리마다 고유 한 것이 있음을 발견했습니다 inode
. 그러나 지금까지 디렉토리로 액세스하는 내장 명령을 찾지 못했습니다 inode
.
답변
OP가 만든 솔루션
내장 명령이 없습니다. 그러나 마지막으로 cd (letes my program icd == (inode cd) 호출)를 사용하여 inode 값을 사용하여 폴더에 입력하는 C 프로그램을 작성할 수 있습니다. 여기에 원시 코드를 게시하고 있습니다.
그러나 여기서 직면 한 근본적인 문제가 있습니다. bash에서 C 코드를 실행하는 동안 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
있습니다. 파일은 하나 이상의 이름 ( 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 내가 게시 비효율적 인 일이 … 엔트로피하는 송시. 그 이유는 파일이나 디렉토리에 대한 액세스가 최적화되고 빠르며 직접적인“기본 키”입니다. 그 이유는 무엇입니까? — 경로 이름 :/dir/dir/file_or_dir
. 또한 주어진 디렉토리에 대한 액세스 권한을 부여하려면 시스템에서 경로의 모든 권한을 확인해야합니다. 다시 한번, inode로 액세스하면 파일 시스템을 재귀 적으로 스캔합니다.
2. 에서 스캔하여 상황을 악화시킬 수 있습니다/
. 삼
3. 하지만 그것을하지 않습니다 일, 아이 노드는 당 파일 시스템 (당 마운트)으로 독특한 때문이다.
답변
당신은 수 Tab를 나열하는 대신 사용할 수있는 폴더를 회전. 파일을 편집 ~/.inputrc
하고 추가하십시오
"\C-i": menu-complete
"\e[Z": "\e-1\C-i"
모든 사용자가 원하는 경우 /etc/inputrc
대신 편집하십시오 .
Ctrl+ x와 Ctrl+ r를 누르면 효과가 있습니다.
이제 cd
Tab이름을 쓰지 않고 폴더를 탐색 하는 데 사용하십시오. 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
(실제 순서는 커널, 파일 시스템 …에 따라 달라집니다)와 배쉬는 자동으로 첫 번째 경로로 이동합니다.
반면 비슷한 이름의 폴더가없는 경우가 많으므로 a*d
중간 문자를 모두 입력하지 않고도 폴더 를 확장 할 수 있습니다. 실제로 입력 할 수없는 경우 (예 : 이름이 다른 스크립트 또는 다른 인코딩으로되어 있음) 파일 이름을 8 진수로 인코딩해야 할 때 특히 유용합니다.
답변
파일 관리자 (예 : 노틸러스)에서이 디렉토리를 찾아 터미널로 끌어서 놓기 만하면됩니다.
이전 cd
에 터미널을 입력 하면 명령이 표시됩니다.
답변
그것이 정확히 원하는 것인지 확실하지 않지만 zsh
디렉토리의 엄격한 이름을 입력하는 것 이외의 다른 방법으로 디렉토리에 액세스하는 데 필요한 몇 가지 트릭이 있습니다. 예를 들어, 이름의 일부를 입력하면 디렉토리의 전체 이름으로 확장되어 다음과 같이 매우 유용한 것을 허용합니다.
타격 TAB…
답변
가장 간단한 방법은 디렉토리 이름을 두 번 클릭 한 다음 (화면에 표시되어 있다고 가정) cd 다음에 공백을 입력하고 마우스의 휠 단추를 클릭하면 강조 표시된 디렉토리 이름을 복사하여 붙여 넣는 것입니다. Enter 키를 누르면 필요한 디렉토리로 변경됩니다.
이 절차를 항상 사용하며 디렉토리 이름에만 국한된 것은 아닙니다. 명령 행을 사용하는 모든 명령에 사용할 수 있습니다.
행운을 빕니다.