Answers:
通常,解析ls的输出是一个非常糟糕的主意。做你想要的更好的方法是
stat -c "%n %y" * | grep 2013-0[678]
或者,仅检查最后一个字段,以防止文件名本身是日期的可能性很小:
stat -c "%n %y" *| awk '$NF ~ /2013-0[678]/'
来自man stat
:
-c --format=FORMAT
use the specified FORMAT instead of the default; output a new‐
line after each use of FORMAT
%y time of last modification, human-readable
%n file name
| awk '$NF ~ /2013-0[678]/'
以仅检查最后一个输出字段,即使文件名与日期不匹配,即使文件名与正则表达式都匹配(不太可能?)。
ls
是用于以人类可读的方式显示有关文件信息的命令。不要在脚本中使用它。
在目录树中查找符合特定条件的文件的命令是find
。如果您有GNU查找(即非嵌入式Linux或Cygwin)或FreeBSD查找(即FreeBSD或OSX),则可以-newermt
用来匹配在某个日期之后最后修改的文件。
find . -newermt '1 June' ! -newermt '1 September' -print
如果要匹配特定年份中的文件,请添加年份,而不是脚本运行时的日历年。
如果您的find实现没有-newermt
,则必须使用-newer
,它会将find
找到的文件的日期与固定文件进行比较。用于touch
创建具有要用作边界的日期的临时文件。
dir=$(mktemp -d)
touch -d 201306010000 "$dir/from"
touch -d 201309010000 "$dir/to"
find . -newer "$dir/from" ! -newer "$dir/to" -print
rm -r "$dir"
[...]
构造匹配一个字符,该字符可以是方括号之间的任何字符。因此,您的表达式匹配JJA
或Jug
((J
from[Jun]
,u
from[Jul]
和g
from[Aug]
),但不匹配您希望匹配的月份缩写。