Linux:查找给定';原件';文件(反向读取链接)
考虑以下命令行代码段:Linux:查找给定';原件';文件(反向读取链接),linux,bash,symlink,reverse,Linux,Bash,Symlink,Reverse,考虑以下命令行代码段: $ cd /tmp/ $ mkdir dirA $ mkdir dirB $ echo "the contents of the 'original' file" > orig.file $ ls -la orig.file -rw-r--r-- 1 $USER $USER 36 2010-12-26 00:57 orig.file # create symlinks in dirA and dirB that point to /tmp/orig.file:
$ cd /tmp/
$ mkdir dirA
$ mkdir dirB
$ echo "the contents of the 'original' file" > orig.file
$ ls -la orig.file
-rw-r--r-- 1 $USER $USER 36 2010-12-26 00:57 orig.file
# create symlinks in dirA and dirB that point to /tmp/orig.file:
$ ln -s $(pwd)/orig.file $(pwd)/dirA/
$ ln -s $(pwd)/orig.file $(pwd)/dirB/lorig.file
$ ls -la dirA/ dirB/
dirA/:
total 44
drwxr-xr-x 2 $USER $USER 4096 2010-12-26 00:57 .
drwxrwxrwt 20 root root 36864 2010-12-26 00:57 ..
lrwxrwxrwx 1 $USER $USER 14 2010-12-26 00:57 orig.file -> /tmp/orig.file
dirB/:
total 44
drwxr-xr-x 2 $USER $USER 4096 2010-12-26 00:58 .
drwxrwxrwt 20 root root 36864 2010-12-26 00:57 ..
lrwxrwxrwx 1 $USER $USER 14 2010-12-26 00:58 lorig.file -> /tmp/orig.file
在这一点上,我可以使用readlink
来查看符号链接的“原始”文件是什么(好吧,我猜这里通常的术语是“目标”或“源”,但我心目中的那些概念也可能是相反的,所以我将其称为“原始”)文件,即
$ readlink -f dirA/orig.file
/tmp/orig.file
$ readlink -f dirB/lorig.file
/tmp/orig.file
。。。然而,我想知道的是——是否有一个命令可以在“原始”文件上运行,并找到指向它的所有符号链接?换句话说,类似于(伪):
提前感谢您的评论
干杯 符号链接不会跟踪指向给定目的地的内容,因此,检查每个符号链接是否指向所需的目的地(如
for i in *; do
if [ -L "$i" ] && [ "$i" -ef /tmp/orig.file ]; then
printf "Found: %s\n" "$i"
fi
done
我还没有看到这方面的命令,这也不是一项容易的任务,因为目标文件不包含源文件指向它的任何信息 这类似于“硬”链接,但至少这些链接始终位于同一文件系统上,因此您可以执行
find-inode
来列出它们。软链接问题更大,因为它们可以跨文件系统
我认为您需要做的基本上是对整个层次结构中的每个文件执行ls-al
,并使用grep
搜索->/path/to/target/file
例如,我在我的系统上运行了一个(格式化为可读性-最后两行实际上在实际输出的一行上):
这是我想到的。我在OSX上做这个,它没有
readlink-f
,所以我不得不用一个helper函数来替换它。如果你有一个合适的readlink-f
,你可以用它来代替。另外,的使用同时。。。使用GNUfind
完成,这将查找硬链接或符号链接到文件的文件:
find -L /dir/to/start -samefile /tmp/orig.file
这对于您想要做的事情来说可能过于简单,但我发现它很有用。
它不会逐字回答您的问题,因为它不是“在原始文件上运行”,但它完成了任务。但是,更多的硬盘访问。而且,它只适用于“软”链接文件,而软链接文件是大多数用户链接文件
从数据存储目录或用户数据目录的根目录,无论symlinked
“files”与orig.file
可能位于何处,运行find命令:
# find -type l -ls |grep -i 'orig.file'
或
我通常会使用名称的一部分,例如,“*orig*”
,因为我们知道用户会将一个简单命名的文件重命名(前缀)为更具描述性的文件,如“Jan report from London u.orig.file.2015.01.21”或其他什么
注意:我从未使用过-samefile选项
干净、简单、易于记忆
希望这对别人有帮助。
兰迪斯。受戈登·戴维森评论的启发。这与另一个答案类似,但我使用exec获得了期望的结果。我需要一些可以在不知道原始文件所在位置的情况下找到符号链接的东西
find / -type l -exec ls -al {} \; | grep -i "all_or_part_of_original_name"
你好@paxdiablo-同样感谢你的明确回答+接受对“硬链接”和“find-inode
”的引用。干杯不要忘记,在安装了nfs的服务器上可以有符号链接。因此,仅仅查看本地服务器可能还不够。这既不适用于递归链接(指向…)也不适用于相对链接(无论如何->../../usr/share/applications)。处理这些案件更加困难。此外,它会为每个检查的文件生成一个新的ls
实例,这意味着它会非常慢。@paxdiablo对于速度,使用find/-type l-ls
如何?这跳过了非符号链接,并避免了所有每个文件进程的创建(这比我的答案更快)。另外,我如此担心速度的原因是我的启动卷上有824220个文件,如果你为每个文件创建一个进程。。。还需要一段时间。我听说处理“ls”命令的输出是七宗罪中的一宗;它对Mac用户也很有用!干杯嗨@Dennis Williamson,谢谢你,+1感谢你的回答!:)顺便说一句,这与上面提到的“…目标文件不包含源文件指向它的任何信息…”有什么关系;“…基本上对每个文件执行ls-al
?”??这个命令基本上是相同的(但可能以更优化的方式)还是根本不同的?再次感谢,干杯@SDAU:目标文件不包含该信息。此命令基本上是对链接回它的文件的强制搜索。是否有任何与busybox find相同的方法?@g.rocket:查找硬链接文件:find/dir/to/start-follow-inum$(stat-c%i/tmp/orig.file)
。您可能会想出一些方法来查找符号链接,但我什么也没想到。@qodeninja:如果-samefile
的参数名称是一个目录,那么结果将是目录(或指向目录的符号链接)。如果希望显式,请将-type d
添加到指定起始目录位置后的命令中,例如:find-L/dir/to/start-type-d-samefile/tmp/orig.dir
find -L /dir/to/start -samefile /tmp/orig.file
# find -type l -ls |grep -i 'orig.file'
# find /Starting/Search\ Path/ -type l -ls |grep -i '*orig*'
find / -type l -exec ls -al {} \; | grep -i "all_or_part_of_original_name"