3

我试图只从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

但它给出了一些奇怪的结果,显然不符合我的目的。关于如何获得正确输出的任何想法?

4

6 回答 6

6

不要解析ls输出。

ls是一种交互式查看文件信息的工具。它的输出是为人类格式化的,并且会导致脚本中的错误。使用globsfind代替。了解原因: http: //mywiki.wooledge.org/ParsingLs

我推荐这种方式:

如果您想要日期和文件路径:

find . -name 'TRACK*' -printf '%a %p\n'

如果您只想要日期:

find . -name 'TRACK*' -printf '%a\n'
于 2012-12-16T12:18:30.593 回答
4

You could try another approach with something like

find . -name 'TRACK*' -exec stat -c %y {} \; | sort

You can add something like | cut -f1 -d' ' if you only need the date.

于 2012-12-16T11:10:00.863 回答
2

I guess this does suffice:

ls -lhrt | grep TRACK | awk '{print $6, $7, $8}'
于 2012-12-16T11:07:45.897 回答
1

As already said, never parse the output of ls!

Since you only want the modification time, the command date has a cool option for that: option -r (man date for more info).

Hence, you probably want this instead of your line:

for i in TRACK*; do date -r "$i"; done

I don't know how you want the format of the date, so play with the options, e.g.,

for i in TRACK*; do date -r "$i" "+%D"; done

(the formats are in man date).

于 2012-12-16T18:43:36.353 回答
1

通过以下方式可以更好地处理这种替换sed

ls -lrth | grep TRACK | sed 's/ \+/ /g;s/ \([0-9]\) / 0\1 /g' | cut -d" " -f 7
于 2012-12-16T12:21:03.140 回答
0

用于stat获取有关文件的信息。

此外,tr仅进行一对一的字符翻译。它不会用两个字符的序列替换一个字符的序列。

于 2012-12-16T18:47:51.043 回答