在-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
列出了所有我不想关注的符号链接;我现在正在尝试找到一种使用该查询进行修剪的方法。