2012-09-13 35 views
0

我在名稱格式的多個文件如下所述:如何從通用名稱的目錄中刪除文件UNIX除了最新的一個

  1. ABC_Report_v-20120801_1741.csv
  2. ABC_Report_v,20120801_1741.csv
  3. ABC_Report_v-20120907_1254.csv
  4. XYZ_Dashboard_v-20120802_1804.csv
  5. XYZ_Dashboard_v-20120806_2031.csv
  6. XYZ_Dashboard_v -20120802_1946.csv

我想刪除除最新一個像ABC_Report_v-20120907_1254.csvXYZ_Dashboard_v-20120802_1946.csv 多個文件具有相同名稱_v字符應該被刪除,只保留最新的一個之前的所有文件。

+1

您可以在「rm ABC_Report_v - *。csv」等命令中使用通配符刪除多個文件。你可以弄清楚這樣的事情 –

+0

這只是目錄中兩個文件的一個例子,還有更多的文件在給定格式中的名稱。要手動刪除一個一個的同名格式是不可能的,而且我必須保留最新的一個並刪除其餘文件。 – user1650823

+0

'ls -1t ABC_Report _ *。csv | awk'{if(NR!= 1){cmd =「rm -rf」$ 0; system(cmd);}}'' – Vijay

回答

1

請注意,這不能防止重複行。在處理它之前,應該先將文件列表uniq這樣,或者在嘗試刪除已經消失的文件時記得忽略這些錯誤。

$ awk -F- 'NR>1 && $1==base {print last} {base=$1;last=$0}' files.txt 
ABC_Report_v-20120801_1741.csv 
ABC_Report_v-20120801_1741.csv 
XYZ_Dashboard_v-20120802_1804.csv 
XYZ_Dashboard_v-20120806_2031.csv 

從這裏,一旦你驗證了相匹配的文件是那些保持,可以通過管道輸出通過xargs -n 1 rm

請注意,此解決方案需要您的文件列表按日期進行預先排序。這應該是大多數系統上的默認行爲ls。所以:

$ ls | awk '...' | xargs -n 1 rm -v 

在進行編程式刪除之前,請務必備份您的數據,因爲您對自己的工作沒有100%的信心。哎呀,總是要備份你的數據。永遠不知道下一個太陽地點什麼時候會擊中。

+0

+1:很好。 –

+0

Thanx Ghoti,上面的命令$ ls | awk'...'| xargs -n 1 rm -v完美運作。 – user1650823

+0

如果我想保留最新的2個文件並將其餘的全部刪除,那麼上面的命令應該改變什麼 – user1650823

相關問題