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


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'

Answers:


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 2015年

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和a while read有点过分……
卡米洛·马丁

1
如果仅搜索某些文件,查找确实很有用
rubo77
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.