之前,我使用以下命令创建了一些指向另一个文件夹的链接。
sudo ln -s path_name link_name
这些链接看起来与文件夹相似。我无法区分文件夹和链接。有没有办法找出文件夹和指向另一个文件夹的链接之间的区别?
答案1
有很多方法可以看到这一点。首先,它在 的输出中显示出来ls -l
。请注意,目录d
在权限字段的开头有一个 ,而链接有一个l
:
$ ls -l
drwxr-xr-x 2 terdon terdon 4096 Feb 13 14:12 bar
lrwxrwxrwx 1 terdon terdon 3 Feb 13 14:12 foo -> bar
您还可以使用file
:
$ file bar foo
bar: directory
foo: symbolic link to `bar'
另一个选择是readlink
按照符号链接到他们的目标:
$ readlink foo
bar
运行readlink bar
将不会返回任何输出(失败,返回非 0 的退出代码),因此您可以执行以下操作:
readlink bar || echo "Not a link!"
或者
readlink foo && "Echo this is a link"
最后,您还可以使用find
或 shell 本身来列出所有链接:
find . -type l
或者
for f in *; do [ -L "$f" ] && echo "$f is a link"; done
答案2
->
您可以通过输出中的小箭头 ( ) 识别链接ls -l
:
或者通过 的输出中出现的颜色来区分ls
,如 中所述这个答案(test2
是链接):
答案3
阅读man [
(或man test
)你会看到你可以做到:
for theDir in path_name link_name ; do
if [ -L $theDir ] ; then
echo "$theDir exists and is a symbolic link"
elif [ -d $theDir ] ; then
echo "$theDir exists and is a directory"
fi
done
$theDir
我改变了测试的顺序,因此仅当其不是链接时才会检查目录。
答案4
使用ls -F
。
这将使 ls 将字符附加到文件名
*
对于可执行文件
/
对于目录
@
对于符号链接**
|
对于 FIFO
>
对于门(无论这意味着什么)
=
用于插座
常规文件末尾没有分类器。因此,就您而言,您会在@
每个符号链接名称的末尾以及/
实际目录的末尾看到分类器。
但是如果您使用,ls -l
您将看不到符号链接的分类器,而是会看到->
之后的链接目标。
您还可以使用stat
和file
来区分目录/符号链接,例如:
$ file a
a: directory
$ file b
b: symbolic link to a
$ stat a
File: 'a'
Size: 40 Blocks: 0 IO Block: 4096 directory
[...]
$ stat b
File: 'b' -> 'a'
Size: 1 Blocks: 0 IO Block: 4096 symbolic link
[...]