백업 목적으로 한 파일에 대한 파일 경로가 여러 개 있는데 이제 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");