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

2024-01-11

我怎样才能得到$YEAR, $MONTH, and $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

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

我发现一个示例对于带有连字符的日期的文件效果很好,但它使用#占位符sed(这让我的大脑受伤)。我宁愿有一个$YEAR, $MONTH, and $DAY变量,以便我可以更好地理解它并根据我的喜好调整函数(即order-by-month or 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
}

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

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
}

使用正则表达式和参数扩展 http://tiswww.case.edu/php/chet/bash/bashref.html#Shell-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

Output:



2010 12 20
2016 01 01
2016 04 13
2017 01 11
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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