이름을 쓰지 않고 어떻게 디렉토리에 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 키를 누르면 필요한 디렉토리로 변경됩니다.

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

행운을 빕니다.