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

时间:2017-01-17 20:10:28

标签: 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

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

我找到了一个适用于带有连字日期的文件的示例,但它使用了# sed占位符(导致我的大脑受伤)。我更愿意使用$YEAR$MONTH$DAY变量,以便我更好地理解它并根据自己的喜好调整函数(即order-by-month或{{1} })。

order-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
}

1 个答案:

答案 0 :(得分:4)

使用正则表达式和Parameter Expansion

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

输出:

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