bash 배열의 패턴과 일치하는 모든 파일 이름을 저장하고 싶습니다.
내 솔루션이 작동하지 않습니다. 파이프 사용으로 인해 문제가 발생한 것 같은데 어떻게 해결해야 할지 모르겠습니다.
i=0
find . -type f | grep -oP "some pattern" | while read -r line; do
arr[$i]=$line;
let i=i+1;
done
답변1
bash-4.4
위와 같이 사용하면 다음과 같습니다.
readarray -d '' -t arr < <(
find . -type f -print0 | grep -zP 'some pattern')
이전 bash
버전의 경우:
arr=()
while IFS= read -rd '' file; do
arr+=("$file")
done < <(find . -type f -print0 | grep -zP 'some pattern')
또는 ( bash
zsh 스타일 arr+=()
구문이 없는 이전 버전과의 호환성을 위해):
arr=() i=0
while IFS= read -rd '' file; do
arr[i++]=$line
done < <(find . -type f | grep -zP 'some pattern')
귀하의 접근 방식에는 몇 가지 문제가 있습니다.
-o
를 사용하면grep
전체 레코드가 아닌 패턴과 일치하는 레코드 부분만 인쇄됩니다. 당신은 여기서 그것을 원하지 않습니다.find
줄 바꿈은 파일 경로의 모든 문자만큼 유효하므로 줄 바꿈으로 구분된 기본 출력은 사후 처리될 수 없습니다. NUL로 구분된 출력이 필요합니다. 따라서 NUL로 구분된 레코드를 처리하려면-print0
infind
및-z
in이 필요합니다.grep
IFS=
에 전달하는 것도 잊어버렸습니다read
.- 에서는
bash
이 옵션이 없으면 파이프라인의 마지막 부분이 서브셸에서 실행되므로 해당 서브셸lastpipe
만 업데이트하면 됩니다 .$arr