이름을 쓰지 않고 어떻게 디렉토리에 CD를 넣을 수 있습니까? 모르겠습니다. 리눅스가 파일 시스템을 구현할 때 두 디렉토리

때로는 폴더 이름으로 디렉토리에 액세스하는 것이 성가시다. 라는 디렉토리가 있다고 가정 해보십시오 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+ xCtrl+ r를 누르면 효과가 있습니다.

이제 cdTab이름을 쓰지 않고 폴더를 탐색 하는 데 사용하십시오. cdShift+ Tab는 다른 방향으로 회전합니다.

가치가 기억하는 cd -마지막 방문 폴더로 이동합니다.


답변

쉘 와일드 카드를 사용할 수 있습니다.

예를 들어 할 수 있습니다

cd a?b?c?d

또는

cd a\*b\*c\*d

그리고 와일드 카드를 실제 이름으로 확장하고 해당 디렉토리로 변경합니다. 그것이 유일한 디렉토리라고 가정합니다.

당신이 모두있는 경우 a b c da1b2c3d, 다음 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 키를 누르면 필요한 디렉토리로 변경됩니다.

이 절차를 항상 사용하며 디렉토리 이름에만 국한된 것은 아닙니다. 명령 행을 사용하는 모든 명령에 사용할 수 있습니다.

행운을 빕니다.