我想找到目录结构中的所有符号链接,并能够区分哪些是文件链接,哪些是目录链接。
这个命令做了我需要的一切,除了告诉我哪些链接是目录,哪些链接是文件。
find . -type l -ls
答案1
我猜你想找到哪些文件常规文件以及哪些是目录。
所以你可以使用这样的东西:
解决方案1
find -type l -exec stat -L --printf '%n is a %F\n' {} +
如果您有指向命名管道或任何其他类型文件的符号链接,上面的命令也会打印它们。
忽略损坏的链接:
find -type l ! -xtype l -exec stat -L --printf '%n is a %F\n' {} +
#or
find -type l -not -xtype l -exec stat -L --printf '%n is a %F\n' {} +
#Or
find -type l -readable -exec stat -L --printf '%n is a %F\n' {} +
用于stat -L
跟踪链接,而%n
和%F
分别用于获取文件名和文件类型。
例如,具有以下结构:
lrwxrwxrwx 1 edgar edgar 65 Nov 29 17:51 dirOne2Link -> /home/edgar/Documents/Gitlab/Linux_programming/testing/forums/one
lrwxrwxrwx 1 edgar edgar 65 Nov 29 17:54 fileTwo2Link -> /home/edgar/Documents/Gitlab/Linux_programming/testing/forums/two
drwxr-xr-x 2 edgar edgar 4096 Nov 29 17:50 one
-rwxr--r-- 1 edgar edgar 201 Nov 25 21:13 script
-rw-r--r-- 1 edgar edgar 0 Nov 29 17:50 two
使用find
上面的命令我得到:
./fileTwo2Link is a regular empty file
./dirOne2Link is a directory
解决方案2
您也可以 find
不使用-exec stat ...
:
find -type l -printf "%p is a %Y\n"
通过上面的命令我得到:
./pipelink is a p
./fileTwo2Link is a f
./onemorebroken is a N
./dirOne2Link is a d
./broken is a N
其中p
是命名管道,f
是常规文件,N
是不存在的文件(例如断开的链接),d
是目录。