환경 변수에 설정된 디렉터리 목록에서 파일을 어떻게 찾을 수 있나요?

환경 변수에 설정된 디렉터리 목록에서 파일을 어떻게 찾을 수 있나요?

나는 그것이 어디에 있을 수 있는지 찾으려고 노력하고 있습니다 $LD_LIBRARY_PATH. 기본적으로 나는 다음을 시도하고 있습니다.

 find $LD_LIBRARY_PATH -name "*libdl*"

그러나 변수에 여러 항목이 있고 my a 를 구분하기 때문에 위 명령은 실패합니다 :. 오류가 발생합니다.

    No such file or directory

어떻게 해야 하나요?

답변1

*PATH 변수는 콜론으로 구분된 디렉토리 목록이므로 단어 분할에 콜론을 사용할 수 있습니다.

이전 IFS를 저장하고 복원하려면 다음 줄의 주석 처리를 제거하십시오(권장).

#oldIFS="$IFS"
IFS=:
set -o noglob # disable the glob part of the split+glob operator
              # unlikely to be needed as library directories
              # are unlikely to have wildcard characters in their
              # name.
find -H $LD_LIBRARY_PATH -mindpeth 1 -maxdepth 1 -name "*libdl*"
#IFS="$oldIFS"
#set +o noglob

-H이러한 구성 요소 중 하나라도 심볼릭 링크인 경우 필수입니다 $LD_LIBRARY_PATH. -mindepth 1(GNU 확장, 현재는 다른 많은 구현에서 볼 수 있음) 구성 요소 자체 일치를 방지하고 -maxdepth하위 디렉터리에서 검색을 건너뜁니다(동적 링커에서 검색할 의도가 없음).

Bash 약어는 기본값을 가정 $IFS하고 디렉터리에 해당 기본값에 대한 문자 $IFS(공백, 탭 및 줄 바꿈)나 와일드카드가 포함되어 있지 않은 것으로 알려져 있고 이러한 디렉터리 중 어느 것도 기호 링크도 하위 디렉터리도 없으며 이러한 이름은 디렉토리 자체가 패턴과 일치하지 않습니다:

find -H ${LD_LIBRARY_PATH//:/ } -name "*libdl*"

이것은바꾸기 명령각 콜론을 공백으로 변환합니다(ksh93에서 복사한 기능).

zsh다음과 같은 가정을 하지 않고 를 사용하세요 .

print -rC1 - ${(s[:])^LD_LIBRARY_PATH}/*libdl*(ND)

관련 정보