如何从文件名中提取特定元素?

yll*_*ate 7 shell bash zsh shell-script

我有一堆以下格式的文件:

2014-11-19.8.ext
2014-11-26.1.ext
2014-11-26.2.blah.ext
2014-11-26_3.ext
2014-11-26.4.stuff_here.ext
2014-12-03.1. could be anything.ext
2014-12-032b.ext
2014-11-26 613 adva.ext
Run Code Online (Sandbox Code Playgroud)

我的目标是遍历整个文件列表,并从中获取日期格式YYYY-MM-DD并将其存储在一个变量中以YYYYMMDD供进一步处理(在我的情况下它将被推送到touch命令中)。

所以通常我会匹配这个正则表达式: (\d{4})-(\d{2})-(\d{2}).*

然后用于$1$2$3获取我想要的模式,但是我不确定如何在bash/ 中执行此操作zsh

这如何在 shell 脚本中完成?

Sun*_*eep 9

使用参数扩展

$ touch 2014-11-19.8.ext 2014-11-26.1.ext
$ for f in *.ext; do d="${f:0:4}${f:5:2}${f:8:2}"; echo "$d"; done
20141119
20141126
Run Code Online (Sandbox Code Playgroud)
  • ${f:0:4}表示从索引开始的 4 个字符0f是变量名
  • 替换echo "$d"为您的代码


Jef*_*ler 5

遍历当前目录中的每个文件并将它们的文件名与所需的模式进行比较,然后设置一个包含日期片段的变量

for f in *
do 
  [[ $f =~ ^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])(.*) ]] && 
  yourvar="${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[3]}"
done
Run Code Online (Sandbox Code Playgroud)

这利用了bash[[使用正则表达式匹配将日期片段放入 BASH_REMATCH 数组的能力。