我试图只从ls -lrth | grep TRACK
date部分 ls -lrth | grep TRACK
输出:
-rw-r--r-- 1 ins ins 0 Dec 3 00:00 TRACK_1_20121203_01010014.LOG -rw-r--r-- 1 ins ins 0 Dec 3 00:00 TRACK_0_20121203_01010014.LOG -rw-r--r-- 1 ins ins 0 Dec 13 15:10 TRACK_9_20121213_01010014.LOG -rw-r--r-- 1 ins ins 0 Dec 13 15:10 TRACK_8_20121213_01010014.LOG
但是,这样做:
ls -lrth | grep TRACK | tr "\t" " " | cut -d" " -f 9
只给了我两位数和空位的date:
13 13
所以我用tr
命令试了一下,把所有的单个数字的date翻译成两位数:
ls -lrth | grep TRACK | tr "\t" " " | tr "[1-9]" "['01'-'09']" | cut -d" " -f 9
但是,这有些奇怪的结果,显然不符合我的目的。 任何想法如何获得正确的输出?
不要分析ls
输出。
ls
是交互式查看文件信息的工具。 其输出格式为人类,并会导致脚本中的错误。 使用globs
或find
。 理解为什么: http : //mywiki.wooledge.org/ParsingLs
我推荐这种方式:
如果你想要的日期和文件路径:
find . -name 'TRACK*' -printf '%a %p\n'
如果你只想要日期:
find . -name 'TRACK*' -printf '%a\n'
你可以尝试另一种方法
find . -name 'TRACK*' -exec stat -c %y {} \; | sort
你可以添加像| cut -f1 -d' '
东西 如果你只需要这个日期, | cut -f1 -d' '
。
我想这个就足够了:
ls -lhrt | grep TRACK | awk '{print $6, $7, $8}'
这样的替代将通过sed
更好地处理:
ls -lrth | grep TRACK | sed 's/ \+/ /g;s/ \([0-9]\) / 0\1 /g' | cut -d" " -f 7
正如已经说过的,永远不要分析ls
的输出!
既然你只需要修改时间,命令date
有一个很酷的选项:选项-r
( man date
更多信息)。
因此,你可能想要这个而不是你的行:
for i in TRACK*; do date -r "$i"; done
我不知道你想要的日期格式,所以玩的选项,例如,
for i in TRACK*; do date -r "$i" "+%D"; done
(格式在man date
)。
使用stat
来获取关于文件的信息。
另外, tr
只能进行一对一的字符翻译。 它不会用双字符替换单字符序列。