如何通过此查找避免多级符号链接?

如何通过此查找避免多级符号链接?

我知道线并尝试修复我的发现-mindepth 15失败

find -L $HOME -type f -name "*.tex" \
   -exec fgrep -l "janne" /dev/null {} + | vim -R -

失败的尝试

find -L $HOME -type f -mindepth 15 -name "*.tex" \
   -exec fgrep -l "janne" /dev/null {} + | vim -R -

其粗壮

Vim: Reading from stdin...
find: ‘/home/masi/LOREM’: Too many levels of symbolic links

符号链接的可视化不成功,它提供了所有文件,而我只想查看系统中的符号链接目录和文件

tree -l

Law29的提案

# include symlinks
find "$1" -type l -name "$2*" -print0 \
    | xargs -0 grep -Hr --include "*.tex" "$2" /dev/null {} + | vim -R -

输出不成功但不能为空

Vim: Reading from stdin...
grep: {}: No such file or directory
grep: +: No such file or directory

系统特点

masi@masi:~$ ls -ld -- "$HOME" /home/masi/LOREM 
drwxr-xr-x 52 masi masi 4096 Aug 16 16:09 /home/masi
lrwxrwxrwx  1 masi masi   17 Jun 20 00:27 /home/masi/LOREM -> /home/masi/LOREM/

masi@masi:~$ type find
find is /usr/bin/find

masi@masi:~$ find --version
find (GNU findutils) 4.7.0-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2) 

系统:Linux Ubuntu 16.04 64 位
对于线程处的脚本:这里
查找:4.7.0
Grep:2.25
应用findhaetex 这里

答案1

如果要显示 下的所有文件$HOME(包括通过符号链接引用的文件),这些文件以字符串 结尾.tex并包含字符串janne

find -L "$HOME" -type f -name '*.tex' -exec grep -l 'janne' {} + 2>/dev/null | vim -R -

如果您只想显示在$HOMEname下找到的*.tex与包含字符串的文件相对应的符号链接janne

find -L "$HOME" -xtype l -name '*.tex' -exec grep -l 'janne' {} + 2>/dev/null | vim -R -

避免错误消息“符号链接级别过多”的唯一方法是丢弃所有错误,我已经在构造中完成了这一点2>/dev/null

在这两种情况下,find动词都不会遍历它已经遍历过的文件和目录 - 它会记住它已经访问过的位置并自动修剪文件系统树的这些部分。例如,

mkdir a a/b a/b/c
cd a/b/c
ln -s ../../../a

# Here you can ls a/b/c/a/b/c/a/b/...

# But find will not continue for very long
find -L a
a
a/b
a/b/c
find: File system loop detected; ‘a/b/c/a’ is part of the same file system loop as ‘a’.

答案2

你的问题是你有递归符号链接。我会考虑两种选择:

  • 忘记-L,获取树中任何位置名为 .tex 的所有文件,然后过滤它们(除了位于以“Math”开头的符号链接指向的目录中之外,没有其他条件吗?)

  • 分两步进行,都没有-L:首先搜索名为“Math*”的所有符号链接(也许还有目录?)。您获取该列表并从那里递归搜索您的 tex 文件,如下所示:

    find . -type l -name "Math*" -print0 \    
        | xargs -0 grep -Hr --include "*.tex" "janne"
    

答案3

如果您使用的原因-L是因为$HOME它是一个符号链接,并且您仍然想find进入它(但不在目录的其他符号链接中,这会导致您遇到问题),那么请使用:

find "$HOME/" -name '*.tex' -type f -exec fgrep -l janne {} +

/dev/null不需要-l)。

或者:

find -H "$HOME" -name '*.tex' -type f -exec fgrep -l janne {} +

里面看起来常规的通常只查看文件,您不想查看 fifo、设备或目录的内部。要同时查看常规文件的符号链接(但您可能会多次查看同一个文件),您可以将 更改为-type f-xtype f假设是 GNU find)。

相关内容