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
예, 그게 전부입니다.