bash의 여러 파일 경로에서 csv 파일 추출

bash의 여러 파일 경로에서 csv 파일 추출

백업 목적으로 한 파일에 대한 파일 경로가 여러 개 있는데 이제 at의 ".csv"를 기준으로 필터링하고 싶습니다. 나는 그것을 시도했다.

filesall=(/home/abc/allfiles/*)
files=$((${filesall[@]}|grep -F ".csv"))
files=$(${filesall[@]}|grep -oe "*.csv")

하지만 .csv 파일을 추출할 수 없습니다.$filesall. 나도 이렇게 할 수 있다는 걸 알아

files=(/home/abc/allfiles/*.csv)

제안 사항이 있으면 어떻게 filesall에서 모든 .csv 파일을 얻을 수 있나요? 감사해요.

답변1

이것은 실제로 최선의 접근 방식이 아닙니다. 배열을 구문 분석하는 이유는 무엇입니까? 더 간단한 방법은 다음과 같습니다.

path=/home/abc/allfiles
filesall=(${path}/*)
files=(${path}/*.csv)

자신의 방식대로 하려고 한다면 다음과 같이 해야 합니다.

files=($(for file in "${filesall[@]}"; do [[ $file =~ \.csv$ ]] && echo $file; done))

또는

files=($(printf "%s\n" "${filesall[@]}" | grep '\.csv$'))

그러나 파일 이름에 공백이 포함되어 있으면 위의 두 가지가 모두 깨집니다. (앞에 공백을 추가 saveIFS="$IFS"; IFS=$'\n' 하고 뒤에 오면 공백과 함께 작동하도록 할 수 있지만 IFS="$saveIFS"여전히 줄 바꿈에서는 중단됩니다.)

답변2

terdon의 답변을 바탕으로 작동하는 답변은 다음과 같습니다.

모든 파일=(모든 파일)
File=();"${filesall[@]}"의 파일에 대해 [[ $file =~ \.csv$ ]] && files+=("$file");

관련 정보