如何使查找遵循大多数(但不是全部)符号链接?


10

我的操作系统和主目录位于SSD上。我将一些大文件存储在硬盘上,并从主目录到硬盘进行符号链接(例如〜/ Videos / Films是/ mnt / hdd / Films的符号链接)。我也有许多Wine前缀,每个都有dosdevices / z:符号链接到/。

因此,如果使用不带-L的find,它将丢失硬盘上的所有内容。但是,如果我将find与-L一起使用,由于Wine与/的符号链接,它最终会陷入循环。

有没有解决这个问题的明智方法,以便在我想要的位置进行搜索?凭直觉,我想要“遵循符号链接,除非它们在名为dosdevices的目录下”之类的东西。“遵循指向硬盘上某些内容的符号链接”也将起作用。

Answers:


11

-prune主要讲述find不递归一个目录下。

find -L -path ~/.wine/dosdevices -prune -o -type f -name 'My Favorite Movie.*' -print

如果您想-lname在条件中使用该-L选项,则不能使用该选项,因为它-L会使大多数谓词作用于链接的目标,包括-lname。在这种情况下,我的建议是同时使用主目录和硬盘根作为搜索的根。

find ~ /mnt/hdd -xtype f -name 'My Favorite Movie.*'

您可能会运行find ~ -type l …以收集符号链接列表,并将其用作其他根。

( IFS=$'\n'; set -f;
  find ~ $(find ~ -type l -lname '/mnt/hdd/*') \
       -xtype f -name 'My Favorite Movie.*' )

如果您确实想在符号链接下进行递归,则可以按目标而不是按名称排除特定的符号链接。但是,您只能排除有限列表,而不能排除模式或子树。

find -L \( -samefile /exclude/this -o -samefile ~/and/that \) -prune -o \
     -type f -name 'My Favorite Movie.*' -print

您可以使用其他条件,例如! -writable(您没有写许可权的文件),但是我认为GNU find只有在目标链接与特定表达式匹配的情况下,才可以在符号链接下进行递归。

您可以构建一个find几乎执行所需操作的命令,只是不排除足够的符号链接,运行find2perl将查询转换为Perl脚本,然后稍微调整一下Perl脚本。但是,有许多GNU开关发现find2perl无法识别。


谢谢!-prune只是我一直在寻找的那种东西。我发现其中find ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype d列出了所有我不想关注的符号链接;我现在正在尝试找到一种使用该查询进行修剪的方法。
Mark Raymond

@MarkRaymond一般原则是find ~ <negative criteria> -prune -o <positive criteria> -print,因此find ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype d -prune -o <whatever it is you want> -print
别再作恶了'

@Giles-在没有-L的情况下可以正常工作,但是一旦我添加-L,-lname表达式将不再起作用(如手册页所说,它们将不再起作用)。因此,基本上,我然后需要一些条件来遵循符号链接,而其他条件则不然!
Mark Raymond

我想不出一种方法来完全按照自己的意愿进行查找。有关一些近似值,请参见我的编辑。
吉尔(Gilles)'所以

1

要搜索所有链接,这对我有用:

find -L . -name \*.txt

0

您有多少个符号链接到硬盘?如果不是太多,一种解决方案是在find命令行上显式指定要遵循的符号链接时不使用“ -L”。就像是:

find .  ~/Videos/Films -name '*file I want*' ...

这将搜索当前目录(“。”)以及符号链接“〜/ Videos / Films”,但不会进入其他符号链接。


0

避免该问题的另一种解决方案(至少对于我而言)是对硬盘上的目录使用绑定安装而不是符号链接。这是通过添加如下条目来完成的/etc/fstab

/mnt/hdd/Films /home/mark/Videos/Films none bind 0 0

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.