이름을 쓰지 않고 어떻게 디렉토리에 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+ xCtrl+ 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 da1b2c3d, 다음 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.