파일이 디렉토리에 대한 심볼릭 링크인지 확인하는 방법은 무엇입니까?

파일이 디렉토리에 대한 심볼릭 링크인지 확인하는 방법은 무엇입니까?

파일이 존재하고 -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'

답변1

두 가지 테스트를 결합하면 됩니다 &&.

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

또는 POSIX 호환 구문의 경우 다음을 사용합니다.

if [ -L "$file" ] && [ -d "$file" ]
...

참고: 사용하는 첫 번째 구문은 [[ expr1 && expr2 ]]유효하지만 ksh(원본), bash 또는 zsh와 같은 특정 셸에만 해당됩니다. 사용된 두 번째 구문 은 POSIX 규격이며 심지어 Bourne 규격도 준수합니다. 즉, 모든 최신 및 유사한 쉘 [ expr1 ] && [ expr2 ]에서 작동합니다.shsh

답변2

다음은 대상이 디렉터리(현재 디렉터리에서 시작)인 심볼릭 링크를 재귀적으로 나열하는 명령입니다.

find . -type l -xtype d

인용하다:http://www.commandlinefu.com/commands/view/6105/find-all-symlinks-that-link-to-directories

답변3

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

관련 정보