파일이 존재하고 -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 ]
에서 작동합니다.sh
sh
답변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