2016-12-01 86 views
1

我想刪除一些碼頭圖像的修訂版本。我想刪除最後2行。我可以打印最後2行:刪除'ls'輸出的最後兩行

ls -lt | tail -n 2 

給我最後2行。

drwxr-xr-x 2 root root 4096 Nov 9 10:56 541a303d3c82785293f89a401038ac33ef2b54b6aeb09efd3d3bda7xxxx 
drwxr-xr-x 2 root root 4096 Oct 25 12:07 c74e1399c99de0c23517abc95bc9b16d09df5c4d518776e77d9ae67xxxx 

現在是我的問題。我如何刪除它們?

我試圖​​但比我刪除一切(ls全輸出)

+0

'LS -t | tail -n 2 | xargs rm -r'您可能首先嚐試使用'xargs echo rm',以確保它能夠做到您想要的。 – eddiem

+1

通常,解析'ls'這樣的東西並不是一個好主意。更好的選擇是使用'find -exec'。 – Questionmark

+1

錯誤命令中的'rm -r *'忽略了其標準輸入 - 除非使用'-i'選項,否則'rm'不會從標準輸入中讀取。 shell將'*'擴展到當前目錄中所有文件名和目錄名中,它們不以'.'開頭,並將這些名稱作爲參數傳遞給'rm',然後完成它應該做的事 - 刪除文件它是作爲參數提供的名稱。 –

回答

2

你可以得到那個工作。我可能會使用類似rm -rf $(ls -t | tail -n2),但這是parsing ls is really not recommended

更簡單的方法是使用find。您可以使用它在特定時間之前刪除所有內容。類似這樣的:find . -mtime -180 -exec rm -f {} \;會刪除比180天前更新的所有內容。

+0

更好。謝謝關於解析'ls'的信息。實際上並不知道。 – DenCowboy

0

只是爲了測試:

ls -t | tail -n 2 | xargs -i -t echo {} 

-t,--verbose 打印在標準錯誤輸出的命令行執行它之前。

試驗結束後,你可以將其刪除:

ls -t | tail -n 2 | xargs -i -t rm -fr {} 

rm -fr 541a303d3c82785293f89a401038ac33ef2b54b6aeb09efd3d3bda7xxxx 
rm -fr c74e1399c99de0c23517abc95bc9b16d09df5c4d518776e77d9ae67xxxx 
0

你有正確的理念;然而,'rm'被刪除後會發生什麼,這就是爲什麼*全部刪除,而不是你試圖將其刪除的原因。

這是一個非常乾淨的方式做到這一點,雖然

rm `ls | tail -n 2`