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
.