我怎样才能得到$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(使用前将#替换为@)