이 조회에서 다중 레벨 심볼릭 링크를 어떻게 방지할 수 있나요?

이 조회에서 다중 레벨 심볼릭 링크를 어떻게 방지할 수 있나요?

알아요철사발견한 내용을 수정하려고 했으나 -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 -
  • find -L그것에 대해여기

그 튼튼한

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
적용 find:haetex 여기

답변1

다음 문자열로 끝나고 다음 문자열을 포함 하는 모든 파일 $HOME(심볼릭 링크를 통해 참조된 파일 포함) 을 표시하려는 경우 :.texjanne

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

$HOME문자열이 포함된 파일에 해당하는 이름 아래에 있는 *.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 fGNU 가정 find).

관련 정보