find 명령을 사용하여 파일에서 여러 패턴 검색

find 명령을 사용하여 파일에서 여러 패턴 검색

grep -f MY_FILE명령줄에서 직접 지정하는 대신 파일에서 가져온 패턴을 검색하는 데 사용할 수 있는 옵션이 있습니다 .

find명령과 비슷한 작업을 수행하고 입력 파일에서 검색할 패턴을 읽을 수 있는 옵션이 있습니까 ?

답변1

find이러한 기능이 내장되어 있지 않은 것 같지만 다음과 같이 파일의 인수를 사용하여 xargs여러 명령을 구성하는 데 사용할 수 있습니다 .find

xargs -a patterns.txt -I% find Pictures/ -name %

patterns.txt필터 에 적합한 패턴 목록은 어디에 있습니까 -name? 한 줄에 하나의 패턴이 있습니다. 패턴에 포함되므로 선행/후행 공백이 없다는 점에 주의하세요. 예:

*.jpg
2018-06-*
*foo*
unicorn.png

메모:이 답변은 매우 쉽고 우아해 보이지만 몇 가지 단점이 있다는 것이 댓글에서 올바르게 지적되었습니다.

find파일의 패턴당 한 번씩 실행되어 전체 검색 폴더를 반복적으로 검색하므로 큰 폴더나 패턴이 많은 경우 성능이 그다지 좋지 않습니다 .

따라서 잠재적으로 겹칠 수 있는 여러 패턴(예: *.jpg*foo*)이 있는 경우에도 둘 이상의 패턴과 일치하는 파일이 결과에 그만큼 많이 표시됩니다. 어쨌든 이름만 인쇄하는 경우 출력을 파이프하여 sort -u중복을 제거할 수 있지만, 예를 들어 해당 결과를 제거하거나 -exec결과에 대해 명령을 실행하는 경우 이는 더 바람직하지 않을 수 있습니다.

이러한 단점 중 하나라도 사용 사례에 문제가 되는 경우 대체 답변 중 하나를 선택하는 것이 더 나을 것입니다.

명령 설명:

  • xargs인수 목록을 읽고 이를 사용하여 새 명령줄을 구성하고 실행합니다.
  • -a patterns.txt표준 입력 대신 해당 파일에서 읽도록 지시합니다.
  • -I%읽은 인수를 명령줄 끝에 추가하는 것이 아니라 %사용자가 제공한 명령줄의 문자를 하나의 인수로 바꾸도록 지시합니다. 이는 입력 인수당 하나의 별도 명령을 생성하고 실행하는 것을 의미합니다.
  • find Pictures/ -name %는 인수를 삽입하려는 명령줄입니다 %. 여기서는 인용할 필요가 없습니다. xargs삽입하는 각 인수가 단일 토큰으로 처리되고 자체적으로 분할되지 않도록 주의하기 때문입니다. 물론 을 Pictures/자신의 검색 디렉토리로 바꿀 수도 있고 . 이외의 다른 필터 및/또는 더 많은 필터를 사용할 수도 있습니다 -name. 삽입 옵션을 사용하기 때문에 -exec ...명령 끝에 같은 작업을 추가할 수도 있습니다.

답변2

를 사용하여 파일 내용에서 정규식을 만들 수 있습니다 paste -sd'|' bar.

find ~/foo -regextype egrep -regex "^.*/($(paste -sd'|' bar))$"

정규식은 다음과 같습니다"^.*/(a|b)$"

답변3

최근에는 제가 만든 적이 있어요.답변-regex플래그를 사용하여 여러 패턴을 결합합니다 find. 이를 기반으로 동일한 작업을 수행하는 작은 스크립트나 함수를 만들 수 있지만 파일에서 패턴 목록을 구축할 수 있습니다.

#!/bin/bash

read_file(){
    local full_pattern=""
    while IFS= read -r pattern; do
        if [ -z "$full_pattern"  ];then
            full_pattern="$pattern"
            continue
        fi
        full_pattern="$full_pattern\|$pattern"
    done < "$1"
    echo "$full_pattern"
}

fp=$(read_file "$1" )
find "$2" -type f -regex ".*\($fp\).*$" 

이것이 하는 일:

  • 우리는 script as 를 호출합니다 findf.sh input.txt /etc. 여기서 첫 번째 위치 매개변수는 패턴이 있는 파일이고 두 번째는 검색할 디렉터리입니다. GNU find는 .디렉토리 인수가 생략된 경우 디렉토리를 가정하므로 $2필수가 아닙니다.
  • 이 함수는 read_file스크립트의 첫 번째 위치 매개변수인 입력 파일을 읽습니다. 이것은 플래그에 대한 패턴을 구축합니다 -regex.
  • 이 패턴은 스크립트의 "기본" 블록에 다시 반영되고 fp변수에 저장되며 명령에 전달됩니다 find.

관련 정보