tr“”“”无法正常工作

我试图只从ls -lrth | grep TRACKdate部分 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是交互式查看文件信息的工具。 其输出格式为人类,并会导致脚本中的错误。 使用globsfind 。 理解为什么: 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有一个很酷的选项:选项-rman date更多信息)。

因此,你可能想要这个而不是你的行:

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

我不知道你想要的日期格式,所以玩的选项,例如,

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

(格式在man date )。

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

另外, tr只能进行一对一的字符翻译。 它不会用双字符替换单字符序列。