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

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

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

/home/myname

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

/home/pulsar/... 

다른 디렉토리로 꽤 깊이 들어가야 하는데 전체 줄을 입력하지 않고도 어떻게 이 문제를 해결할 수 있습니까? 나는 노력했다

cd */thedirectoryiwanttogointo

하지만 그건 작동하지 않습니다. 전체 줄을 입력해야 합니다.

답변1

아마도 다음과 같은 이유로 와일드카드가 작동하지 않을 것입니다.

  • 귀하가 제공한 위치에서 와일드카드와 일치하는 항목이 없습니다.
  • 경기가 1개 이상 있었습니다.

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

CDPATH기능(아마도 tcsh에서 처음 볼 수 있음)은 콜론으로 구분된 디렉터리 목록입니다. 귀하 이름의 부모가 thedirectoryiwanttogointo합리적으로 고유한 경우 해당 부모를 목록에 추가할 수 있습니다.

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

pushdpopd보다 최신이지만 여전히 CDPATH1990년대 중반부터 사용됩니다. 이를 통해 현재 디렉터리를 저장(스택에 "푸시")하고 해당 cd명령 중에 복원(스택에서 "팝핑")할 수 있습니다. 자세한 내용은 다음을 참조하세요.

다른 사람들은 쉘 별칭이나 기호 링크를 사용합니다. 잘 알려진 장소에 갈 때 가장 유용합니다.

답변2

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

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

$ cds thedirectoryiwanttogointo

물론, 아래에 있는 하위 디렉터리 및 파일 수 /home와 OS가 메모리의 모든 트리를 캐시할 수 있는지 여부에 따라 성능이 크게 달라질 수 있습니다.

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에만 해당되지만 대부분의 최신 쉘에는 비슷한 기능이 있다고 생각됩니다.

관련 정보