我正在尝试仅从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
只给出了两位数的日期和单个数字的空格:
13
13
所以我尝试使用tr
命令将所有单个数字日期翻译成两位数:
ls -lrth | grep TRACK | tr "\t" " " | tr "[1-9]" "['01'-'09']" | cut -d" " -f 9
但它给出了一些奇怪的结果,显然不符合我的目的。关于如何获得正确输出的任何想法?
答案 0 :(得分:6)
不要解析ls
输出。
ls
是用于交互式查看文件信息的工具。它的输出格式化为人类,并将导致脚本中的错误。请改用globs
或find
。了解原因:http://mywiki.wooledge.org/ParsingLs
我推荐这种方式:
如果您想要日期和文件路径:
find . -name 'TRACK*' -printf '%a %p\n'
如果您只想要日期:
find . -name 'TRACK*' -printf '%a\n'
答案 1 :(得分:4)
您可以尝试使用类似
之类的其他方法find . -name 'TRACK*' -exec stat -c %y {} \; | sort
如果您只需要日期,则可以添加| cut -f1 -d' '
之类的内容。
答案 2 :(得分:2)
我想这确实足够了:
ls -lhrt | grep TRACK | awk '{print $6, $7, $8}'
答案 3 :(得分:1)
通过sed
更好地处理这种替换:
ls -lrth | grep TRACK | sed 's/ \+/ /g;s/ \([0-9]\) / 0\1 /g' | cut -d" " -f 7
答案 4 :(得分:1)
如前所述,永远不要解析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
)。
答案 5 :(得分:0)
使用stat
获取有关文件的信息。
此外,tr
只进行一对一的字符翻译。它不会用双字符序列替换单字符序列。