Bash * 이중 대괄호를 사용하는 if 문에서는 디렉터리 와일드카드가 작동하지 않습니다.

Bash * 이중 대괄호를 사용하는 if 문에서는 디렉터리 와일드카드가 작동하지 않습니다.

이것은 작동합니다:

if  [ /a/*/b/file.asd -nt  /c/d/file.asd ]; then echo "found new file"; fi

이것은 작동하지 않습니다:

if  [[ /a/*/b/file.asd -nt  /c/d/file.asd ]]; then echo "found new file"; fi

/*/이중 괄호가 사용되지 않는 이유를 설명할 수 있는 사람이 있습니까 ?

답변1

쉘 글로빙 패턴은 여러 경로 이름으로 확장될 수 있습니다. 예를 들어 /a/*/b/file.asd여러 경로 이름으로 확장되면 수행 중인 테스트가 의미가 없게 됩니다.

또한 쉘 글로브는 다음과 같습니다.아니요내부로 확장되었습니다 [[ ... ]]. bash매뉴얼 에서 :

[[및 사이의 단어에 대해 토큰화 및 경로 이름 확장을 수행 하지 마십시오 .]]

당신이 할 것을 안다면특별한파일(예: )을 선택한 /a/x/b/file.asd다음 테스트에서 해당 경로 이름을 사용합니다. 테스트를 수행하고 싶다면모두루프를 사용하여 이 패턴과 일치하는 경로 이름:

shopt -s nullglob dotglob
for pathname in /a/*/b/file.asd; do
    if [[ $pathname -nt /c/d/file.asd ]]; then
        printf 'found new file: %s\n' "$pathname"
    fi
done

패턴이 일치하지 않는 경우 패턴을 제거하고 숨겨진 디렉터리를 캡처하는 옵션을 설정 nullglob하고 셸합니다.dotglob*

find또한 패턴이 /a/*/b/file.asd수천 개의 경로 이름으로 확장되지 않는 한 를 사용하여 테스트를 수행할 수 있습니다 .

find /a/*/b/file.asd -prune -type f -newer /c/d/file.asd

그러면 패턴이 확장 /a/*/b/file.asd되고 확장된 각 경로 이름이 검색 경로로 사용됩니다 find. 검색 경로를 테스트 /c/d/file.asd하고 파일보다 최신인 경우 경로 이름을 인쇄합니다. 디렉토리를 참조하는 경우 를 대비하여 검색 경로 아래로 이동하지 마세요 -prune.find

관련 정보