디렉토리를 변경할 때 와일드카드 *가 작동하지 않는 이유는 무엇입니까?

디렉토리를 변경할 때 와일드카드 *가 작동하지 않는 이유는 무엇입니까?

예를 들어 내 디렉토리에는 다음이 있습니다.

/home/myname

그런 다음 CD를 다른 디렉토리에 넣고 싶습니다.

/home/pulsar/... 

다른 디렉토리로 드릴다운해야 하는데 전체 줄을 입력하지 않고도 이 작업을 수행할 수 있는 방법은 무엇입니까? 나는 노력했다

cd */thedirectoryiwanttogointo

그러나 이것은 작동하지 않습니다. 전체 줄을 입력해야 합니다.

답변1

다음과 같은 이유로 와일드카드가 작동하지 않을 수 있습니다.

  • 제공한 위치에 와일드카드와 일치하는 콘텐츠가 없습니다.
  • 하나 이상의 게임.

(셸에서) 하위 디렉터리 사이를 자주 이동하는 일반적인 방법은 및 와 CDPATH함께 이 기능을 사용하는 것입니다 . pushdpopd

CDPATH기능(아마도 tcsh에서 처음 등장했을 것임)은 콜론으로 구분된 디렉토리 목록입니다. 이름의 부모가 thedirectoryiwanttogointo매우 독특한 경우 목록에 부모를 추가할 수 있습니다.

더 읽어보려면(쉘 매뉴얼 페이지가 먼저 와야 합니다):

pushd그보다 popd최신 CDPATH이지만 여전히 1990년대 중반으로 거슬러 올라갑니다. 이를 통해 현재 디렉터리를 저장(스택에 "푸시")하고 해당 명령 중에 이를 복원(스택에서 "팝")할 수 있습니다 cd. 추가 자료:

다른 것들은 쉘 별칭이나 기호 링크를 사용합니다. 이는 잘 알려진 장소로 여행할 때 가장 유용합니다.

답변2

가능한 모든 대상 디렉토리가 아래에 있고 /home디렉토리 이름에 개행 문자가 없다고 가정하면 다음 쉘 함수를 사용할 수 있습니다.

cds() {
    cd "$(find /home -type d -name "$1" | head -n 1)"
}

$ cds thedirectoryiwanttogointo

물론 성능은 하위 디렉터리와 파일의 수 /home, 운영 체제가 메모리의 모든 트리를 캐시하는 기능이 있는지 여부에 따라 크게 달라집니다.

GNU 시스템에서는 다음 구문을 사용하여 속도를 높이고 파일 이름에 줄 바꿈을 사용하여 더욱 안정적으로 만들 수 있습니다.

cds() {
    cd "$(find /home -type d -name "$1" -print -quit)"
}

첫 번째 일치 항목이 발견되면 검색이 중지됩니다.

매개변수는 패턴으로 처리되므로 다음을 수행할 수 있습니다.

cds 'foo*bar'

예를 들어 이름이 로 시작 하고 로 끝나는 cd첫 번째 디렉터리(지정된 순서 없음)로 이동합니다 .foobar

답변3

와일드카드 확장을 통해 시스템의 어느 위치에서나 경로를 찾고 싶습니다. 모드를 올바르게 지정하면 다음을 수행할 수 있습니다.

cd /**/thedirectoryiwanttogointo

기본적으로 zsh 및 Fish에서 작동합니다.Bash에서 처음으로 이 작업을 수행하는 경우shopt -s globstar, 존재하다tcsh 만약 당신이set globstar, ksh93에서 set -o globstar, yash만약에 set -o extended-glob.

/와일드카드는 현재 디렉터리에 대한 상대 경로가 아닌 다음으로 시작하는 절대 경로에서 사용되며 **이 패턴을 사용하도록 선택하면 원하는 수의 하위 디렉터리로 확장되기 때문에 작동합니다 .

이것이 효과가 있을지라도,시간이 오래 걸릴 수 있습니다. 쉘은 전체 시스템에서 일치하는 파일을 검색해야 합니다. 더 긴 접두사를 제공하면 검색 공간을 더욱 줄일 수 있습니다.

cd /home/pulsar/**/thedirectoryiwanttogointo/

더 깊게 드릴할수록 검색할 필요가 줄어듭니다. 이는 시간이 많이 걸리지 않으며 디렉토리 트리가 상당히 희박한 경우 실제로 실용적입니다. 후행을 사용하면 /확장이 디렉터리만 대상으로 하여 발생할 수 있는 다양한 모호성을 제거할 수 있습니다.

여전히 일치하는 항목이 여러 개 있으면 결과는 셸에 따라 달라집니다. Bash와 Fish는 모호함을 무시하고 첫 번째 알파벳 일치로 전환합니다. tcsh와 yash는 오류를 보고합니다. zsh와 ksh는 이를 고급 디렉터리 전환 기능 중 하나를 사용하려는 시도로 해석합니다.아마도오류를 신고하세요.


동일한 디렉토리를 재사용할 가능성이 있는 경우 상위 디렉토리를입력하다CDPATH$FOO또는 긴 경로 대신 사용할 수 있는 셸 변수를 만드는 것이 더 나은 옵션이 될 것입니다. **쉘 변수를 자주 사용하는 경우 이를 확장과 결합하여 입력 시간을 훨씬 더 줄일 수 있습니다.

답변4

항상 동일한 깊은 디렉터리에 액세스하는 경우 간단한 해결책은 해당 디렉터리를 가리키는 심볼릭 링크를 만드는 것입니다.

ln -s ~/foo/bar/baz/quux/etc/etc/etc/target ~/shortcut

이전에 해당 디렉토리를 방문한 적이 있는 경우 다른 해결책은 Ctrl-R을 누르고 검색하려는 문자에 대한 명령 기록을 검색하는 것입니다. 이것은 bash에만 해당되지만 대부분의 최신 쉘에는 비슷한 기능이 있다고 생각됩니다.

관련 정보