2009-12-05 60 views
2

我想要的ls -la的輸出格式爲僅包含在十二月修改過的文件和輸出他們很好,這是他們目前的樣子:排序與awk的輸出,並將其格式化

 
ls -la | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5 
Dec 4 20:15 folder/ 
Dec 4 19:51 ./ 
Dec 4 17:42 Folder\ John/ 
Dec 4 16:19 Homework\ MAT\ 08/ 
Dec 4 16:05 Folder\ Smith/ 

等。 。

如何設置像一個正則表達式不包括像「./」和「../」的東西,

此外,我怎麼能忽略斜槓‘\’對於有空格的文件夾在他們中。我想在最後放下斜線。這可能通過shell命令嗎?或者我將不得不使用Perl對測試進行修改?我確實希望日期和時間保持原樣。任何幫助將不勝感激!

該框有Linux,這是通過SSH完成的。

編輯:

繼承人什麼我到目前爲止(感謝馬克和gbacon此)

ls -laF | grep -vE ' ..?/?$' | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } ' | grep "Dec" | sort -r | head -5 

我只是具有隻是一個空間「」代替「\」的麻煩。除此之外感謝所有幫助達到這一點!

回答

1

可以使用find做的大部分工作對您:

find -mindepth 1 -maxdepth 1 -printf "%Tb %Td %TH:%TM %f\n" | grep "^Dec" | sort -r 

父目錄(..)不包含在默認情況下。 -mindepth 1擺脫當前目錄(。)。您可以刪除-maxdepth 1以使其遞歸,但您應該將%f更改爲%p以包含具有文件名的路徑。

這些都是在-printf領域:

  • %鋱 - 短短的一個月名
  • %Td的 - 該月的一天
  • %TM:%TM - 小時和分鐘
  • % f - 文件名

grep中,我添加了一行匹配的行,所以它不會匹配名爲「Decim例如,11月份修改過的「al」。

+0

非常好,這工作得很好,謝謝! – 2009-12-06 04:35:45

1

這裏是你的答案之一:

我如何設置像一個正則表達式不包括像「./」和「../」,

使用ls -lA而不是ls -la

而是打印出列的固定數量的,可以打印出了從第6列t時行的末尾:

ls -lA | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } ' 

我沒有得到的空間反斜線,所以不知道你爲什麼這樣做。要修復它,你可以添加:

| sed 's/\\//g' 
+0

進出口仍然得到 12月4日19:51 ./ 當我運行: LS-LA | awk {'print $ 6,$ 7,$ 8,$ 9,$ 10'} | grep「Dec」| sort -r |頭-5 – 2009-12-05 23:11:46

+1

ls -A打印以'.'和'..'開頭的所有文件夾。你使用標準的GNU工具還是其他的東西? – 2009-12-05 23:15:31

+0

馬克,請原諒我的無知,但我該如何檢查並確保它們不是標準之外的東西? ls -lA | awk'{for(i = 6; i <= NF; i ++)printf(「%s」,$ i);的printf( 「\ n」); }「> test.txt的;頭-3的test.txt 12月5日17時18 ./ 12月4日14點50個../ LS --version LS(GNU的coreutils)5.97 版權(C)2006年自由軟件基金會,公司 這是免費軟件。您可以根據GNU通用公共許可證的條款 重新分發它的副本。 在法律允許的範圍內,不存在任何擔保。 由Richard Stallman和David MacKenzie撰寫。 – 2009-12-05 23:19:28

1

檢查並確保你的'ls'命令不是別名。通常,「原始」ls不會爲您提供/ for目錄,也不應該逃離這些空間。

很顯然,你的awk打印這些文件時,有些東西正在逃避你的空間,因爲awk傾向於通過空白打開字段,這就是\字符的用途。

空格是文件名是專門設計來挫敗寫簡單的腳本和管道混搭,就像你在這裏試圖做的那樣。

0

也可以通過添加grep -v "\." | grep -v "\.\."

不知道其餘

1

下降...您可以過濾的ls輸出:

ls -la | grep -vE ' ..?/?$' | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5 

如果你的內容使用Perl :

ls -la | perl -lane 's/\\//g; 
        print "@F[5..9]" 
         if $F[8] !~ m!^..?/?$! && 
          $F[5] eq "Dec"' 
+0

謝謝你解決了我的問題。和..! – 2009-12-05 23:20:19

+1

不客氣!樂意效勞。 – 2009-12-05 23:36:24

+0

如果在perl中做這件事更容易,而且我知道我將只是內容,不反對在perl中做。 – 2009-12-05 23:38:54

0

它真的讓我很難看到awk和grep/sed的流水線。 Awk是一個非常強大的線處理工具。

ls -laF | awk ' 
    /\.\.?\/$/ {next} 
    /Dec/{for (i=1; i<=5; i++) $i = ""; print} 
' | sort -r | head -5 
1

什麼是所有的greps和seds?

ls -laF | awk '!/\.\.\/$/ && !/\.\/$/ &&/Dec/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); }' 
+0

這有一個問題,沒有顯示名稱以「。」結尾的文件。 – Vijay 2009-12-10 11:40:22