bashの複数のファイルパスからcsvファイルを抽出する

bashの複数のファイルパスからcsvファイルを抽出する

バックアップの目的で1つのファイルへの複数のファイルパスがあるので、atの ".csv"に基づいてフィルタリングしたいと思います。試してみました。

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

ただし、.csvファイルを抽出することはできません。$filesall。私もこれができることを知っています

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

提案がある場合は、どのようにファイルからすべての.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");

関連情報