2012-12-16 144 views
3

我試圖削減只有日期部分從ls -lrth | grep TRACK輸出:TR 「[1-9]」, 「[ '01' - '09']」 不正常

-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 comman d,對所有單個數字日期轉化爲兩位數:

ls -lrth | grep TRACK | tr "\t" " " | tr "[1-9]" "['01'-'09']" | cut -d" " -f 9 

但它提供了一些奇怪的結果,顯然不爲我的目的。關於如何獲得正確輸出的任何想法?

回答

2

我想這樣做就夠了:

ls -lhrt | grep TRACK | awk '{print $6, $7, $8}' 
4

你可以嘗試的東西另一種方法像

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

你可以添加| cut -f1 -d' '東西,如果你只需要日期。

6

不要解析ls輸出。

ls是一款交互式查看文件信息的工具。它的輸出格式爲人類,並會導致腳本中的錯誤。改爲使用globsfind。明白爲什麼:http://mywiki.wooledge.org/ParsingLs

我建議是這樣的:

如果你想要的日期和文件路徑:

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

如果你只想要日期:

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

那種的替換最好通過sed處理:

ls -lrth | grep TRACK | sed 's/ \+/ /g;s/ \([0-9]\)/0\1 /g' | cut -d" " -f 7 
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)。

+0

並非所有'date'版本都支持'-r'選項。祝你們好運。 – shellter

0

使用stat獲取有關文件的信息。

另外,tr只能進行一對一的字符翻譯。它不會用雙字符替換單字符序列。

相關問題