从 Bash 中的文件名中提取日期的实用程序?

G. *_*ard 0 bash sed

如何从以下文件名中获取$YEAR$MONTH$DAY变量:

201601010557 - Development Database.bak
Screen Shot 2017-01-11 at 10.42.14 PM
SIRIUS Internet Radio - Howard 100 20101220 0600.mp3
Howard Stern Show - 20160413.mp3
Run Code Online (Sandbox Code Playgroud)

我正在尝试按名称中的日期组织文件。但是,我很难理解sedgrep命令。这些文件包含三种不同格式的日期。

我发现了一个例子,它可以很好地处理带有连字符日期的文件,但它使用#占位符sed(这会导致我的大脑受伤)。我更希望有一个$YEAR$MONTH$DAY变量,这样我就可以更好地理解它并根据我的喜好调整函数(即order-by-monthorder-by-year)。

org-by-date(){
    ls -A1 | grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}' | while read -r line; do
        DNAME="$(echo $line | grep -Eo '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}' | sed 's#-#/#g')"
        mkdir -p "./$DNAME"
        mv "$line" "./$DNAME/"
    done
}
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来获取日期变量?例如:

order-by-date(){
    ls -A1 | grep -E '( ... magic pattern here ... )' | while read -r line; do
        YEAR="$(echo $line....)
        MONTH="$(echo $line....)
        DAY="$(echo $line....)

        # ... and in a perfect world, get times IF they exist...
        HOUR="$(echo $line....)
        MINUTE="$(echo $line....)
        SECOND="$(echo $line....)
    done
}
Run Code Online (Sandbox Code Playgroud)

Cyr*_*rus 5

使用正则表达式和参数扩展

for i in *; do
  [[ $i =~ [0-9]{8}|[0-9]{4}-[0-9]{2}-[0-9]{2} ]]
  x="${BASH_REMATCH[0]//-/}"
  y="${x:0:4}"
  m="${x:4:2}"
  d="${x:6:2}"
  echo "$y $m $d"
done | sort -n
Run Code Online (Sandbox Code Playgroud)

输出:

2010 12 20
2016 01 01
2016 04 13
2017 01 11