파일의 줄을 반복하여 각 줄과 일치하는 파일을 찾으려면 어떻게 해야 합니까?

파일의 줄을 반복하여 각 줄과 일치하는 파일을 찾으려면 어떻게 해야 합니까?

BASH 쉘에서 파일의 행을 가져오고 싶습니다(예:패턴.txt) 이름에 파일의 각 줄에 패턴이 포함된 파일을 내 시스템에서 찾습니다. 그래서 나는 다음과 같은 for 루프를 가지고 있습니다.

for pp in `cat pattern.txt`; do find ./ -iname "*${pp}*" -print0; done

첫 번째 줄이 다음과 같으면 파일을 찾을 수 없습니다.패턴.txt존재합니다. 그렇다면 위의 명령줄을 수정하는 방법은 무엇입니까?

참고: 내 파일의 각 줄에는 [a-zA-Z] 문자만 포함되어 있습니다.

답변1

이는 파일에서 검색된 여러 파일 이름 패턴을 찾기 위한 안전한 Windows 비보호 방법입니다. 내가 선택한 방법은 패턴 목록을 표현식으로 처리하는 것이었습니다 find.

find_expression=$(<pattern \
    sed -e 's/^/-o\n-iname\n*/' \
        -e 's/\r\?$/*/' |            # turn each pattern into -o -iname *foo*
    tail -n +2)                      # remove spurious initial -o
set -f                               # turn off globbing
IFS='
'                                    # split only at newlines
find . \( $find_expression \) -print0
set +f; unset IFS                    # restore defaults

답변2

이 시도:

#!/bin/bash

while IFS= read -r pp; do
  find . -iname "*${pp}*" -print0
done < /path/to/pattern.txt

왜 그걸 원하셨는지 모르겠지만 -print0어쨌든 남겨두었어요. 어쩌면 당신은 그것을 파이프로 연결하려고합니까 xargs?

답변3

@SiegeX가 제공한 답변은 효과가 있지만 스키마 파일에 파일이 많으면 속도가 느려지고 다루기 어려워질 수 있습니다. 다음과 같은 다양한 도구를 사용하면 더 나은 성능을 얻을 수 있습니다.

find . | grep -f pattern.txt

예, 그게 전부입니다.

관련 정보