![재귀 Grep의 디렉터리에서 모든 .tex 파일을 찾는 방법은 무엇입니까?](https://linux55.com/image/9365/%EC%9E%AC%EA%B7%80%20Grep%EC%9D%98%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%97%90%EC%84%9C%20%EB%AA%A8%EB%93%A0%20.tex%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%B0%BE%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
.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
- 디렉토리를 가리키는 "Math"라는 이름의 모든 심볼릭 링크를 찾으십시오.
- 모든 심볼릭 링크 디렉터리를 반복합니다(여기서는 grep이 제한될 수 있다고 생각합니다).
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"
- 이름이 지정된 모든 심볼릭 링크를 찾습니다
Math*
. - 찾은 각 경로에서 작업을 다시 수행하여 파일을
find
찾습니다*.tex
. 호출하려면xargs
경로 이름이 하나만 필요합니다 . 경로 이름은 자리 표시자에 입력됩니다 .-n 1
find
XXX
- 호출은 발견된 파일의 문자열로 이루어집니다
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) xargs
GNU를 사용하고 있다고 가정하면 됩니다 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