![将 csv 文件从路径中提取到 bash 中的多个文件](https://linux22.com/image/55643/%E5%B0%86%20csv%20%E6%96%87%E4%BB%B6%E4%BB%8E%E8%B7%AF%E5%BE%84%E4%B8%AD%E6%8F%90%E5%8F%96%E5%88%B0%20bash%20%E4%B8%AD%E7%9A%84%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6.png)
我有一个文件多个文件路径用于备份目的,现在我想根据来自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");完毕