Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Bash中从文件名提取日期的实用程序?_Bash_Sed - Fatal编程技术网

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

在Bash中从文件名提取日期的实用程序?,bash,sed,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 我正在尝试按名称中的日期组织文件。但是,我很难理解sed和grep命令。这些文件包含三种不同格式的日期 我

如何从以下文件名中获取
$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-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
}
使用正则表达式和:

输出:

2010 12 20 2016 01 01 2016 04 13 2017 01 11 2010 12 20 2016 01 01 2016 04 13 2017 01 11 使用正则表达式和:

输出:

2010 12 20 2016 01 01 2016 04 13 2017 01 11 2010 12 20 2016 01 01 2016 04 13 2017 01 11
请在您的问题中添加该示例输入的示例输出。@Cyrus:done(提前感谢)@G.Deward您是否愿意接受与awk有关的内容?@LarsFischer老实说,我太笨了,不能说“是”或“否”。只要它足够详细,让一个noob能够理解并且能够处理不同的格式,我将不胜感激。请在你的问题中添加该样本输入的样本输出。@Cyrus:done(提前感谢)@G.Deward你对涉及awk的事情持开放态度吗?@LarsFischer老实说,我太像noob了,不能说“是”或“不是”。如果文件名是“酷文件名20161231.mp3”或“酷文件名20161231.0600.png”,我理解“或”逻辑,但是
y
m
d
等会发生什么呢?在这两种情况下,输出都是
2016 12 31
${x:4:2}
是否按字符串长度和位置分配?如果是这样的话,当连字符出现时会不会有所不同?它是第一个位置和字符串长度。可能的连字符被零替换:
x=“${BASH\u REMATCH[0]/-/}”
BASH\u REMATCH
我不知道。感谢这个有见地的例子。我理解“或”逻辑,但是
y
m
d
等会发生什么。如果文件名是“Cool Filename 20161231.mp3”或“Cool Filename 20161231 0600.png”?在这两种情况下,输出都会是
2016 12 31
。是否
${x:4:2}
按字符串长度和位置分配?如果是这样的话,当连字符出现时会不会有所不同?它是第一个位置和字符串长度。可能的连字符被零替换:
x=“${BASH\u REMATCH[0]/-/}”
BASH\u REMATCH
我不知道。感谢这个有见地的例子。 2010 12 20 2016 01 01 2016 04 13 2017 01 11