Bash:按模式提取文件名并将其插入数组中

时间:2018-04-11 16:12:04

标签: bash

我有一个文件夹中的文件列表,我想用以下模式提取文件名并将它们插入到数组中。

模式是文件名始终以“MCABC_”或“MCBBC_”开头,然后是日期,然后以“.csv”结尾

一个例子是“MCABC_20110101.csv”,“”MCBBC_20110304.csv“

现在,我只能提出以下可行的解决方案,但这并不理想。

ls | grep -E "MCABC_[ A-Za-z0-9]*|MC221_[ A-Za-z0-9]*"

我读到使用ls是不好的。我应该使用glob

我是bash脚本的新手。如何使用上面的模式提取文件名并将其插入到数组中?感谢。

更新:感谢您的回答。真的很感激你的答案。我有以下代码

#!/bin/bash
shopt -s nullglob
files=(MC[1-2]21_All_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].csv)
echo ${#files[*]}
echo ${files[0]}

这是我跑bash testing.sh时得到的结果。

:无效的shell选项namesh:第2行:shopt:nullglob 1 (MC [1-2] 21_All_ [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9]的.csv )

但是,如果我只是在命令行files=(MC[1-2]21_All_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].csv)然后echo ${files[*]}上运行,我设法获得输出:

MC121_All_20180301.csv MC121_All_20180302.csv MC121_All_20180305.csv MC221_All_20180301.csv MC221_All_20180302.csv MC221_All_20180305.csv

我很困惑。为什么会这样? (请注意,我在窗口10中的ubuntu上运行它。)

2 个答案:

答案 0 :(得分:2)

我认为您可以直接使用glob填充数组:

files=( MC[AB]BC_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].csv )

“日期”部分当然可以改进,因为它匹配完全无效的日期,如98765432,但也许这不是问题。

答案 1 :(得分:-1)

这适用于BASH。

#!/bin/bash
for file_name in M*
do

    line="$line $( printf "${file_name%_*}")"
done
array=( $line )
echo "${array[2]}"

另一种方式:

#!/bin/bash

declare -a files_array
i=0
for file_name in M*
do
    files_array[$i]="$( printf "${file_name%_*}")"
    (( i++ ))
done

echo "${files_array[2]}"

问候!