tr“[1-9]”“['01' - '09']”无法正常工作

时间:2012-12-16 10:54:36

标签: linux bash shell unix

我正在尝试仅从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

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

6 个答案:

答案 0 :(得分:6)

不要解析ls输出。

ls是用于交互式查看文件信息的工具。它的输出格式化为人类,并将导致脚本中的错误。请改用globsfind。了解原因: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有一个很酷的选项:选项-rman 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只进行一对一的字符翻译。它不会用双字符序列替换单字符序列。