只获取sym链接到文件

时间:2014-03-27 23:08:23

标签: linux find symlink

我调查了symbolic link: find all files that link to this filehttps://stackoverflow.com/questions/6184849/symbolic-link-find-all-files-that-link-to-this-file,但他们似乎没有解决问题。

如果我做find -L -samefile path/to/file 结果包含硬链接和sym链接。

我一直试图想出一个解决方案来获取只有sym链接,但似乎无法弄明白。 我一直试图将-samefile-type l结合起来,但这让我无处可去。

man find

表示你可以将一些选项组合到一个表达式中,但我没能正确地完成它。 任何帮助非常感谢!

1 个答案:

答案 0 :(得分:0)

好的,我最初误解了这个问题。

要仅查找某个文件的符号链接,我认为结合多个命令仍然是一个很好的方法。 因此,您知道要链接到的文件,我们将其称为targetfile.txt。我们的目录结构如下:

$ ls -laR
.:
total 24
drwxrwxr-x  4 telorb telorb 4096 Mar 28 09:51 .
drwxrwxr-x 57 telorb telorb 4096 Mar 28 09:49 ..
-rw-rw-r--  1 telorb telorb   21 Mar 28 09:51 another_file.txt
drwxrwxr-x  2 telorb telorb 4096 Mar 28 09:52 folder1
drwxrwxr-x  2 telorb telorb 4096 Mar 28 09:53 folder2
-rw-rw-r--  3 telorb telorb   28 Mar 28 09:52 targetfile.txt

./folder1:
total 12
drwxrwxr-x 2 telorb telorb 4096 Mar 28 09:52 .
drwxrwxr-x 4 telorb telorb 4096 Mar 28 09:51 ..
-rw-rw-r-- 3 telorb telorb   28 Mar 28 09:52 hardlink
lrwxrwxrwx 1 telorb telorb   17 Mar 28 09:49 symlink1 -> ../targetfile.txt

./folder2:
total 12
drwxrwxr-x 2 telorb telorb 4096 Mar 28 09:57 .
drwxrwxr-x 4 telorb telorb 4096 Mar 28 09:51 ..
-rw-rw-r-- 3 telorb telorb   28 Mar 28 09:52 hardlink2
lrwxrwxrwx 1 telorb telorb   17 Mar 28 09:57 symlink2_to_targetfile -> ../targetfile.txt
lrwxrwxrwx 1 telorb telorb   19 Mar 28 09:53 symlink_to_anotherfile -> ../another_file.txt

folder1/hardlink中的文件是targetfile.txt的硬链接,folder1/symlink1是我们感兴趣的符号链接,与folder2/symlink2_to_targetfile相同。还有另一个符号链接到另一个文件,我们对此不感兴趣。

我将采用的方法是首先使用find . -type l从指定文件夹递归获取符号链接(我们仍然有完整的路径信息)。

然后将其传递到xargsls -l以获取链接指向的文件的信息,最后grep我们的targetfile.txt,以便我们删除未指向的链接我们想要的文件。完整的命令:

find . -type l | xargs -I % ls -l % | grep targetfile.txt
lrwxrwxrwx 1 telorb telorb 17 Mar 28 09:57 ./folder2/symlink2_to_targetfile -> ../targetfile.txt
lrwxrwxrwx 1 telorb telorb 17 Mar 28 09:49 ./folder1/symlink1 -> ../targetfile.txt

xargs -I % ls -l %有时会让人感到困惑。基本上使用-I %,您告诉xargs %符号将表示您希望xargs放置其接收的输入的所有位置。所以它会有效地将其替换为ls -l output_of_find_command