将 csv 文件从路径中提取到 bash 中的多个文件

将 csv 文件从路径中提取到 bash 中的多个文件

我有一个文件多个文件路径用于备份目的,现在我想根据来自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 的答案,这里有一个似乎有效的答案:

文件全部=(全部文件
文件=();对于“${filesall[@]}”中的文件;做 [[ $file =~ \.csv$ ]] && files+=("$file");完毕

相关内容