我有一个文件多个文件路径用于备份目的,现在我想根据来自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");完毕