如何检查文件是否是目录的符号链接?

如何检查文件是否是目录的符号链接?

我可以检查文件是否存在并且是带有 -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" ]
...

注意:第一个语法 using[[ expr1 && expr2 ]]是有效的,但仅适用于某些 shell,例如 ksh(它来自何处)、bash 或 zsh。使用的第二种语法[ expr1 ] && [ expr2 ]是 POSIX 兼容的,甚至是 Bourne 兼容的,这意味着它可以在所有现代的shsh类似的 shell中工作

答案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

相关内容