재귀 Grep의 디렉터리에서 모든 .tex 파일을 찾는 방법은 무엇입니까?

재귀 Grep의 디렉터리에서 모든 .tex 파일을 찾는 방법은 무엇입니까?

.tex 파일만 포함하도록 심볼릭 링크에 대한 재귀 검색을 확장하고 싶습니다 find . -type l -name "Math*" -exec grep -d "recurse" word {} +. 실패한 의사 코드 1

find . -type l -name "Math*" \
  -exec WHERE CHOOSE ONLY .tex files and Directories \
  -exec grep -d "recurse" word {} +

.tex 파일과 디렉터리를 선택하는 명령을 입력할 수 없습니다. 즉, 의사코드 2

  1. 디렉토리를 가리키는 "Math"라는 이름의 모든 심볼릭 링크를 찾으십시오.
  2. 모든 심볼릭 링크 디렉터리를 반복합니다(여기서는 grep이 제한될 수 있다고 생각합니다).
  3. grep word파일 목록에 대한 기본 작업 수행

(2)단계를 어떻게 수행하나요?

답변1

나는 이것이 내가 만든 것 중 가장 어리석은 명령 파이프라인 중 하나라고 생각합니다.

$ find . -type l -name "Math*" -print0 |
  xargs -0 -n 1 -IXXX find XXX/ -type f -name "*.tex" -print0 |
  xargs -0 fgrep "word"
  1. 이름이 지정된 모든 심볼릭 링크를 찾습니다 Math*.
  2. 찾은 각 경로에서 작업을 다시 수행하여 파일을 find찾습니다 *.tex. 호출하려면 xargs경로 이름이 하나만 필요합니다 . 경로 이름은 자리 표시자에 입력됩니다 .-n 1findXXX
  3. 호출은 발견된 파일의 문자열로 이루어집니다 fgrep(즉, 고정된 검색 문자열이 있기 때문입니다).grep -F

답변2

한 가지 방법은 다음과 같습니다.

find . -type l -name 'Math*' -print0 | \
xargs -0 sh -c \
    'find -L "$@" -type f -name "*.tex" -exec fgrep word /dev/null {} +' sh

증오심은 sh -c '...' sh필요하며 Math*사건을 처리할 때 공백이 있을 수 있습니다. 그렇지 않으면 언제Math* 공백이 있는 파일 이름으로 확장되지 않습니다., 다음과 같이 작동합니다.

find -L $(find . -type l -name 'Math*') -name '*.tex' \
    -exec fgrep word /dev/null {} +

검색할 수 있는 파일이 하나만 있는 경우에도 파일 이름이 인쇄되도록 합니다 /dev/null.fgrep

greping하기 전에 링크를 구문 분석해야 한다면 그렇게 할 수도 있지만 (1) 파일 이름에 개행 문자가 포함되어 있지 않고 (2) xargsGNU를 사용하고 있다고 가정하면 됩니다 findutils(BSD는 xargs개행 문자를 허용하지 않습니다). -d):

find . -type l -name 'Math*' -exec readlink -f {} + | \
xargs -d '\n' sh -c \
    'find "$@" -type f -name "*.tex" -exec fgrep word /dev/null {} +' sh

관련 정보