我有一些带有时间戳的目录,其前缀可能会有所不同,时间戳以方便的 YYYYMMDD 形式命名,后跟不同的后缀,这些后缀也表示时间顺序(不是以最理智的方式)。不幸的是,名称的标题部分可以包含_
用作字段分隔符的字符。
例如:
/collect/mydir_20161102_0A
/collect/mydir_20161102_0B
/collect/mydir_20161102_0C
/collect/mydir_20161102_1
/collect/mydir_20161102_2
/collect/other_dir_20161103_0A
/collect/other_dir_20161103_0B
/collect/mydir_20161104_0A
/collect/mydir_20161104_0B
/collect/mydir_20161104_0C
/collect/mydir_20161104_1
/collect/mydir_20161104_2
这里显示的名字顺序其实就是创建的时间顺序,包括后缀,所以0A在0B之前,0在1之前。不应该出现不同标题前缀相同时间戳的情况。
目录自创建以来可能已更改或修改,因此不再使用 ctime 和 mtime。
我需要输出包含标题和时间戳的字符串,有或没有前面的路径 so mydir_20161104
or /collect/mydir_20161104
,但这必须始终来自最近的目录。搜索不应通过目录级别递归。
我也想避免解析ls
!
可能不漂亮,而且我没有处理带有换行符的文件名:
所以:
find
_
分隔字段添加到文件的开头awk
-V
字段)0A
1
sed
对于包含任何有效字符的文件名,它可能是安全的,但我必须为此
awk
替换sed
。我的输出:
当然,这只是解析
ls
。;)如果您只需要没有后缀的标题和时间戳,请反转排序 (
sort -Vr
) 并将最后一个修改sed
为:所以:
还有一个可以用换行符处理文件名的版本:
这在整个( in ,in和)中使用
\0
- 分隔线。替换为等效命令。-print0
find
-z
sed
sort
awk
sed