如何从以下文件名中获取$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)
我正在尝试按名称中的日期组织文件。但是,我很难理解sed和grep命令。这些文件包含三种不同格式的日期。
我发现了一个例子,它可以很好地处理带有连字符日期的文件,但它使用#占位符sed(这会导致我的大脑受伤)。我更希望有一个$YEAR、$MONTH和$DAY变量,这样我就可以更好地理解它并根据我的喜好调整函数(即order-by-month或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
}
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)
使用正则表达式和参数扩展:
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