目录的符号链接是文件还是目录?

目录的符号链接是文件还是目录?

我有几个命令可以删除文件和目录。其中一个命令删除了指向目录的符号链接。

这引发了以下问题:哪个命令删除了它?删除文件的命令还是删除目录的命令?

换句话说:什么是目录的符号链接:文件还是目录?

此类命令的示例:

find www -type f ! -name ".htaccess" -delete

答案1

从技术上来说文件,包含一个引用另一个文件系统对象的字符串,但值得注意的是,符号链接的属性与大多数文件略有不同。例如,您可以拒绝对符号链接进行写入,同时保留对目标文件的写入。对链接具有写入特权将允许您删除该链接,即使您没有对目标文件的写入权限。对于某些操作,链接是透明的,而对于其他操作,链接是不透明的,因此它们的内部工作中肯定涉及一些文件系统抽象。

您可能需要检查您的身份验证日志以确定哪个命令删除了它。

编辑:由于您对 find 命令如此感兴趣,请注意 find 根本不处理符号链接。请参见:

Minty17 ~ $ mkdir test
Minty17 ~ $ cd test
Minty17 ~/test $ mkdir testdir
Minty17 ~/test $ touch testdir/testfile1.txt
Minty17 ~/test $ ln -s testdir testlink
Minty17 ~/test $ ls
testdir  testlink
Minty17 ~/test $ find -type f | grep testlink
Minty17 ~/test $ find -type d | grep testlink
Minty17 ~/test $ find -type d 
.
./testdir
Minty17 ~/test $ find -type f 
./testdir/testfile1.txt
Minty17 ~/test $ cd ..
Minty17 ~ $ rm -rf ./test

答案2

它是一个特殊文件,其中一个UNIX早在 Linux 之前就已实现。除了文件和目录,其他文件类型包括链接、命名管道、套接字、设备文件(进一步分为字符设备和块设备)。我告诉你这些是为了强调在 *Nix 中并非所有东西都是目录或文件:还有其他一些有趣的字符。

它有两种不同的使用方式:首先,向多个程序提供一个文件的单一版本,这样任何修改只需进行一次,然后所有程序都可以立即使用。

第二,通过许多不同的等效程序之一提供给定的功能。例如,如下命令awk是任何 *Nix 系统的一部分,但它有许多不同的版本,名称略有不同。事实上,

 $ whereis awk
 awk: /usr/bin/awk /usr/bin/X11/awk /usr/share/awk /usr/share/man/man1/awk.1.gz
 $ file /usr/bin/awk
 /usr/bin/awk: symbolic link to `/etc/alternatives/awk' 
 $ file /etc/alternatives/awk
 /etc/alternatives/awk: symbolic link to `/usr/bin/gawk'
 $ file /usr/bin/gawk
 /usr/bin/gawk: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=76bb13aac7e212164bd6e0d7b8a5d92db44543c9, stripped

真正的文件是呆呆地但为了让我忽略所有等效的选择,符号链接awk已被设定为提供使用呆呆地,对我来说是完全透明的。

为了避免通常的 TL;DR,如果您感兴趣的话,我将只让上面的链接提供更多信息。

编辑:

要查找所有符号链接,您可以使用:

  find /path/to/directory/ToBeSearched -type l

要将它们全部删除,

  Find /path/to/directory/ToBeSearched -type l -exec rm {} \;

或一些这样的变化(无穷无尽)。

相关内容