我有一个文件夹中的文件列表,我想用以下模式提取文件名并将它们插入到数组中。
模式是文件名始终以“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上运行它。)
答案 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]}"
问候!