![如何检查文件是否是目录的符号链接?](https://linux22.com/image/3055/%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%E6%96%87%E4%BB%B6%E6%98%AF%E5%90%A6%E6%98%AF%E7%9B%AE%E5%BD%95%E7%9A%84%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%EF%BC%9F.png)
我可以检查文件是否存在并且是带有 -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 兼容的,这意味着它可以在所有现代的sh
和sh
类似的 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