2010-12-15 113 views
8

我有一個文件夾,其中包含一些subversion版本檢出(在運行capistrano部署配方時檢出)。如何刪除文件夾中除最新三個文件以外的所有文件

我真正想要做的是保持最新的3個版本,其中capistrano腳本簽出並刪除其他的,所以爲此我打算運行命令在終端上運行一些命令,實際上capistrano hasn'這裏沒有任何事情要做,而是一個unix命令。

我試圖運行一個命令來獲取除最後三個文件以外的文件列表並刪除其餘的文件,我可以使用以下命令獲取文件列表。

(ls -t /var/path/to/folder |head -n 3; ls /var/path/to/folder)|sort|uniq -u|xargs 

現在,如果我添加一個rm -Rf到這個命令的末尾,它會返回我帶有未找到的文件以進行刪除。所以這很明顯,因爲這隻返回文件夾的名稱,而不是文件夾的完整路徑。

有無論如何刪除這些文件/文件夾使用一個Unix命令?

回答

13

好的,你的腳本有一些問題。

首先,也是最有問題,是這一行:

ls -t /var/path/to/folder |head -n 3; 

ls -t將返回文件列表中的他們的最後修改時間順序,先從最近修改head -n 3說只列出前三行。所以這是說「給我一個只有列表三個最近修改的文件」,我不認爲是你想要的。

我不太清楚你在用第二個ls命令做什麼,但我非常確定這只是將目錄中的所有文件連接到列表中。這意味着當它得到sort ed和uniq'編輯時,您將只剩下該目錄中所有文件的按字母順序排列的列表。當這個被傳遞到類似xargs rm的東西時,你將在該目錄中清除的所有內容

接下來,sort | uniq不需要uniq部分。您可以使用-u開關sort擺脫重複。無論如何,你不需要這部分。

最後,實際刪除該目錄。在這一部分,你說得對你的問題:只要使用rm -r

這裏是最簡單的方法可以讓我覺得這樣做:

ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r 

這裏的這裏發生了什麼:

  • ls -t1是打印一個列表,每行一個文件/目錄,所有文件的編號爲/var/path/to/folder,按排序最近的修改日期。
  • tail -n +4正在打印ls -t1的輸出中的所有行,從第四行開始(即,最近修改的三個文件將不會被列出)
  • xargs rm -r表示刪除tail的任何文件輸出。 -r表示遞歸刪除文件,所以如果它遇到目錄,它將刪除該目錄中的所有內容,然後刪除目錄本身。

請注意,我沒有排序任何東西或刪除任何重複。這是因爲:

  • ls只報告文件一次,所以有沒有重複刪除
  • 你刪除反正通過各項文件,因此它不會在他們刪除了什麼樣的順序關係。

所有這些都有意義嗎?

編輯:

因爲我是錯ls時傳遞了一個絕對目錄指定完整路徑,因爲你可能無法執行cd,也許你可以使用tail代替。

例如:

ls -t1 /var/path/to/folder | tail -n +4 | xargs find /var/path/to/folder -name $1 | xargs rm -r 
+0

你好感謝你的反應,但我仍然得到的文件只有名字,我的主要需求之一是從服務器的任何目錄運行此代碼,並刪除該文件在該var /路徑/到/文件夾這很好,如果我在同一文件夾var/path/to /文件夾 – nivanka 2010-12-15 08:06:27

+0

@nivanka:這真的很奇怪。你是指定一個相對或絕對路徑?如果要從服務器上的任何目錄運行此命令,則需要指定絕對路徑。你能複製/粘貼你正在使用的* exact *命令嗎? – AgentConundrum 2010-12-15 08:12:54

+0

嗨,這是我做ls -t1/var/path/to/folder | tail -n +4 | xargs rm -r – nivanka 2010-12-15 08:55:29

0

您好我發現了一個辦法做到這一點,我們可以使用UNIX & &

這樣的命令看起來像這樣

cd /var/path/to/folder && ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r 
1

下面是一個有用的方式做任務....... !!

Linux和HP-UX:

LS-T1 | tail -n +50 | xargs rm -r#保留最新的50個文件/目錄。

在SunOS:

RM`(LS -t |頭-n 100,LS)|排序| uniq的-u`

相關問題