이름을 쓰지 않고 어떻게 디렉토리에 CD를 넣을 수 있습니까?


8

때로는 폴더 이름으로 디렉토리에 액세스하는 것이 성가시다. 라는 디렉토리가 있다고 가정 해보십시오 a b c d. 를 사용하는 것 외에도 Tab디렉토리 이름을 입력하지 않고 폴더에 액세스 할 수있는 방법이 있습니까?

Linux에는 특정 파일마다 고유 식별자가 있다는 것을 알고 있습니다. 이것을 사용하여 폴더에 액세스 할 수 있습니까? 이것이 실제로 이루어질 수 있는지 또는 어떻게 해야하는지 모르겠습니다.

리눅스가 파일 시스템을 구현할 때 두 디렉토리 이름의 고유성을 비교한다고 생각합니다. 따라서 각 디렉토리는 공간에서 고유해야합니다. 그러나 데이터베이스 시스템의 기본 키와 같다고 생각합니다. 기본 키가 디렉토리 의 이름 입니까 아니면 다른 고유 식별자가 있습니까 (아마도 일부 숫자는 "후드"아래에 저장되어 있습니까)?

이것을 프로세스처럼 생각하십시오. ps터미널 에서 명령을 실행하면 각 프로세스의 이름과 번호가 포함 된 프로세스 목록이 출력됩니다. 프로세스 번호로 해당 프로세스를 호출해야합니다. 마찬가지로 디렉토리 번호가 있습니까? 따라서 이름으로 전화하는 대신 번호로 디렉토리를 호출 할 수 있습니까?


추가 조사에서 각 디렉토리마다 고유 한 것이 있음을 발견했습니다 inode. 그러나 지금까지 디렉토리로 액세스하는 내장 명령을 찾지 못했습니다 inode.


1
와일드 카드도 작동합니다. 그렇지 않으면 zsh대신 설치bash
— Rinzwind

좋아, 와일드 카드는 내가 찾는 답이 아닙니다. zsh에 대해 생각할 필요
— Maruf

그런 디렉토리 하나에 액세스해야하거나 여러 디렉토리가 있습니까?
— Sergiy Kolodyazhnyy

질문에 솔루션을 추가하는 대신 답변으로 솔루션을 추가하십시오. 이것이 바로 답변입니다!
— kos

해당 프로그램이 경로를 인쇄하도록하고 cd $(icd XXXX)--- 당신은 그 find부분을 다시 작성했습니다 . 이제 다음 작업은 ... 더 효율적인 프로그램, 프로그램 또는 find:-P를 확인하는 것입니다.
— Rmano

답변:


2

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 ;

}

나는 그놈 터미널을 사용하고 있습니다. 분명히 다른 배포판의 경우 코드가 변경됩니다.


1
쉘 스크립트 내의 디렉토리로 이동할 수 있으면 스크립트를 소싱하여 원하는 것을 수행 할 수 있습니다. 명령을 단축하기위한 별명을 정의하십시오.
— daltonfury42

19

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. 하지만 그것을하지 않습니다 일, 아이 노드는 당 파일 시스템 (당 마운트)으로 독특한 때문이다.


감사합니다 @Romano. 실제로 나는 그 문제에 대해 생각하고 있었다. 나는 그 문제가 그렇게 비효율적 인 해결책으로 변할 것이라는 것을 모른다. 그러나 해결책에 대해 생각하십시오. ac 프로그램을 쉽게 작성하여 / bin에 넣은 다음 유일한 inode 번호로 실행하십시오. 그런 생각을 쓸 수 있다면 코드를 게시 할 것입니다.
— Maruf

1
또한 내가 알아야 할 것 같습니다. 이 명령의 첫 부분을 이해합니다. "$ (find ~ -inum 20873234 ******)". 하지만 왜 "2> / dev / null"을 작성하고 있는지 모르겠습니다. 다시 한번 설명해 주시겠습니까?
— Maruf

4
@Maruf, 효율적으로 작동하지 않습니다. 파일 또는 디렉토리에 대한 액세스가 빠르고 직접적으로 최적화되는 "기본 키"는 경로 이름이 무엇인지 추측하는 것 /dir/dir/file_or_dir입니다. C 프로그램도 파일 시스템을 스캔해야 find하며 지난 40 년 동안 최적화되었습니다 ... 여전히 --- 왜? 바로 가기가 필요한 경우 a="/my/really/strange and long/dir path name/"및을 사용하십시오 cd "$a". 이길 수 없습니다. 또는 심볼릭 링크를 사용하십시오.
— Rmano

1
좋은 것 +1. 나는 비슷한 것을 쓰는 데 가장 중요했지만 과제가 전혀 의미가 없기 때문에 너무 게으르다. @Rmano
— Pilot6

3
@Rmano 나는 일반적으로 심지어 단일 파일 시스템에서도 동일한 inode를 가진 여러 파일, 즉 하드 링크가있을 수 있다고 덧붙입니다. 여기서 디렉토리에 대해 이야기하고 있기 때문에 각 디렉토리에는 고유 한 inode가 있습니다 (디렉토리는 하드 링크 될 수 없습니다). 또한 inode를 통해 파일에 직접 액세스 할 수없는 이유는 이것이 디렉토리를 우회하기 때문이라고 생각합니다 순회, 사용자가 해당 자원에 액세스 할 수 있는지 여부를 판별하는 데 필요합니다. (따라서 inode로 디렉토리에 접근 할 수 있다면 커널은 경로를 결정해야한다.)
— Malte Skoruppa

8

당신은 수 Tab를 나열하는 대신 사용할 수있는 폴더를 회전. 파일을 편집 ~/.inputrc하고 추가하십시오

"\C-i": menu-complete
"\e[Z": "\e-1\C-i"

모든 사용자가 원하는 경우 /etc/inputrc대신 편집하십시오 .

Ctrl+ x와 Ctrl+ r를 누르면 효과가 있습니다.

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

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


이것은 좋은 대답입니다. 한 번 표시 한 다음 회전시킬 수 있습니까?
— daltonfury42

1
이것을 다른 바로 가기에 할당 할 수 있습니다. Eclipse를 사용하고 자동 완성을 위해 Ctrl + 공백을 사용하는 데 익숙하므로 대신 "\ C-": menu-complete를 사용하고 탭은 그대로 둡니다.
— Katu

5

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

예를 들어 할 수 있습니다

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 진수로 인코딩해야 할 때 특히 유용합니다.


3

파일 관리자 (예 : 노틸러스)에서이 디렉토리를 찾아 터미널로 끌어서 놓기 만하면됩니다.

이전 cd에 터미널을 입력 하면 명령이 표시됩니다.


실제로 나는 터미널에서 모든 것을하려고합니다. :). 따라서 노틸러스에 대해 생각할 필요가 없습니다. 파일에 액세스하는 절차가 있어야한다고 생각합니다. Linux는 항상 특정 파일의 고유 식별자를 저장합니다. 그러나 나는 그것을하는 방법을 모르거나 실제로 이것을 할 수 있습니다.
— Maruf

당신이 무엇을 요구하는지 불분명합니다. 어떤 방법 으로든 이름을 입력하지 않은 디렉토리로 변경할 수 없습니다.
— Pilot6

성명서를 참조하십시오. 업데이트했습니다.
— Maruf

또는 이것이 단일 파일의 문제점 인 경우 별명을 추가 할 수 있습니다.
— daltonfury42

1

그것이 정확히 원하는 것인지 확실하지 않지만 zsh디렉토리의 엄격한 이름을 입력하는 것 이외의 다른 방법으로 디렉토리에 액세스하는 데 필요한 몇 가지 트릭이 있습니다. 예를 들어, 이름의 일부를 입력하면 디렉토리의 전체 이름으로 확장되어 다음과 같이 매우 유용한 것을 허용합니다.

여기에 이미지 설명을 입력하십시오

타격 TAB...

여기에 이미지 설명을 입력하십시오


1

가장 간단한 방법은 디렉토리 이름을 두 번 클릭 한 다음 (화면에 표시되어 있다고 가정) cd 다음에 공백을 입력하고 마우스의 휠 단추를 클릭하면 강조 표시된 디렉토리 이름을 복사하여 붙여 넣는 것입니다. Enter 키를 누르면 필요한 디렉토리로 변경됩니다.

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

행운을 빕니다.


이 특수 문자를 탈출하지 않습니다
— Scz

1

디렉토리가 하나 또는 몇 개라면 bashrc 또는 다른 init 파일에 별칭이없는 이유는 무엇입니까? 예를 들면 다음과 같습니다.

alias abc='cd /tmp/"a b c"'

그런 다음 거기에 가고 싶을 때마다 abc


0

모든 OS 디렉토리에 대한 해시 테이블을 작성하는 프로그램을 작성할 수 있습니다. 기본적으로 트리 평탄화 프로그램입니다.

그러나 다음과 같은 작업을 수행 할 수 hash-cd 32okjv02있으며 32okjv02to 디렉토리 매핑에 대한 해시 테이블 조회를 수행합니다 . 디렉토리로 이동하십시오. 모든 디렉토리를 색인화하면 정말 빠릅니다.

새로운 디렉토리마다이 프로그램을 호출하려면 mkdir의 별명을 지정하고 매분마다 로그온 할 때 해시 테이블 점검 / 새로 고침 명령을 작성해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.