파일이 디렉토리에 대한 심볼릭 링크인지 어떻게 확인합니까?


64

파일이 존재하고 -L과의 심볼릭 링크인지 확인할 수 있습니다.

for file in *; do
    if [[ -L "$file" ]]; then echo "$file is a symlink"; else echo "$file is not a symlink"; fi
done

그리고 -d가있는 디렉토리 인 경우 :

for file in *; do
    if [[ -d "$file" ]]; then echo "$file is a directory"; else echo "$file is a regular file"; fi
done

그러나 디렉토리에 대한 링크 만 테스트하려면 어떻게해야합니까?


테스트 폴더에서 모든 사례를 시뮬레이션했습니다.

/tmp/test# ls
a  b  c/  d@  e@  f@

/tmp/test# file *
a: ASCII text
b: ASCII text
c: directory
d: symbolic link to `c'
e: symbolic link to `a'
f: broken symbolic link to `nofile'

답변:


75

두 테스트를 &&다음 과 결합하십시오 .

if [[ -L "$file" && -d "$file" ]]
then
    echo "$file is a symlink to a directory"
fi

1
숨겨진 파일과 디렉토리를 점검하기 전에 다음과 같이 진행하십시오.shopt -s dotglob
rubo77

2
[-L "$ file"] && [-d "$ file"]가 더 좋지 않습니까? 쉘 사이에 이식성이있는 것 iirc.
Lennart Rolland

3
@Lennart OP의 예제 코드는을 사용 [[하며 논리적 시작점으로 사용했습니다. [vs 의 장점에 대한 논의는 [[이 답변의 범위를 벗어납니다 (그러나 여기에서 사용 가능 ).


1

find기능 이 있고 사용하는 솔루션 :

dosomething () {
    echo "doing something with $1"; 
}
find -L -path './*' -prune -type d| while read file; do 
    if [[ -L "$file" && -d "$file" ]];
        then dosomething "$file";
    fi; 
done

를 사용 find하고 그에 대한 while read일종의 과잉 ...
카밀로 마틴

1
당신이 특정 파일을 검색 할 경우 찾기는 정말 유용합니다
rubo77
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.