如何从以下文件名中获取$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
我试图按名称中的日期组织文件。但是,我很难理解sed
和grep
命令。这些文件包含三种不同格式的日期。
我找到了一个适用于带有连字日期的文件的示例,但它使用了#
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
}
答案 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