Bash 와일드카드 부분 일치 디렉터리

Bash 와일드카드 부분 일치 디렉터리

사람들의 시스템에서 부분적으로 변경된 디렉토리를 찾으려고 시도하는 bash 스크립트가 있습니다.

cd "$HOMEDIR/AppData/Local/GitHub/PortableGit"*"/bin"

그러나 이것은 작동하지 않는 것 같습니다. 문자열 리터럴만 허용합니다.

올바르게 크기를 조정하는 쉬운 방법이 있습니까?

편집하다:

글쎄요, 이상하네요. 가끔은 효과가 있을 때도 있어요.

내가 이것을 할 때 :

GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin
eval GIT_DIR_PASS=$GIT_DIR
echo $GIT_DIR_PASS

정확한 정보를 얻었네요

하지만 $GIT_DIR_PASS를 다른 변수에 할당하려고 하면 문자열 리터럴 버전이 표시됩니다.

답변1

GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin

위의 와일드카드는 다음을 포함할 수 있는 스칼라 변수에 할당하기 때문에 확장되지 않습니다.하나문자열이므로 토큰화나 파일 이름 생성이 발생하지 않습니다.

eval GIT_DIR_PASS=$GIT_DIR

여기서는 간단한 명령에 대한 인수이므로 와일드카드가 확장되지만 경로가 "GIT_DIR_PATH=...".

echo $GIT_DIR_PASS

여기서는 와일드카드가 확장됩니다. 변수의 내용을 인쇄하는 대신 변수가 참조되지 않기 때문에 확장에 의해 생성된 인수 목록을 인쇄합니다.

당신이 원하는 것:

set -- "$HOMEDIR"/AppData/Local/GitHub/PortableGit*/bin

즉, 패턴을 일치하는 파일 목록으로 확장하고 이를 $1, $2... 에 할당합니다.

GIT_DIR=$1

첫 번째 것을 선택하십시오.

답변2

보세요이 예방법을 알아보세요 bash. 또한 그런 eval것들은 잊어버리세요.

/bin/직접 하위 디렉터리의 직접 하위 디렉터리인 이름이 지정된 모든 디렉터리와 일치하는 glob .../PortableGit/:

HOMEDIR=/home/$USER
ls "$HOMEDIR/AppData/Local/GitHub/PortableGit/"*"/bin"

나는 cd그것이 당신의 문제라고 생각합니다. 정확히 무엇을 하길 원하시나요? 표현식과 일치하는 디렉토리가 여러 개 있는 경우, cd여기서 수행할 계획이 무엇이든 일치하는 첫 번째 디렉토리에서 끝나기 때문에 이 방식으로 호출하는 것은 소용이 없습니다. 순차적으로 디렉터리를 입력하고 그 안에서 작업을 수행하려면 일치하는 출력에 대해 루프를 수행하는 것이 find더 적절해 보입니다.

비슷한 질문이 있습니다스택 오버플로.

관련 정보