2017-05-11 155 views
1

我使用Ubuntu 16.04.1 LTS的bash rm刪除舊文件僅刪除第一個

我發現了一個script刪除一切,但「N」最新的目錄中的文件。

我把它修改成這樣:

sudo rm /home/backup/`ls -t /home/backup/ | awk 'NR>5'` 

它刪除只有一個文件。它會報告以下有關應刪除的其他文件的消息:

rm: cannot remove 'delete_me_02.tar': No such file or directory 
rm: cannot remove 'delete_me_03.tar': No such file or directory 
... 

我相信問題是路徑。它正在尋找當前目錄中的delete_me_02.tar(以及後續文件),並且它以某種方式失去了對正確目錄的引用。

如何修改我的命令以繼續查看所有'n'文件的/ home/backup /目錄?

回答

1

也許找到可以幫助你做你想要什麼:

find /home/backup -type f | xargs ls -t | head -n 5 | xargs rm 

但我會先檢查什麼發現將返回(只是刪除| xargs rm),並檢查是怎麼回事被刪除。

+0

找到是正確的答案。 find/home/backup /。 -type f | xargs ls -t | tail -n + 5 | xargs rm -f' – ekcell

+0

我相信這是有效的,因爲'find'返回完整路徑,我認爲這是一個有點顯着的區別。 – ekcell

1

命令替換擴展後,您的命令行看起來像

sudo rm /home/backup/delete_me_01.tar delete_me_02.tar delete_me_03.tar etc 

/home/backup沒有前綴從輸出的每個字。 (另外:不要在腳本中使用ls;請參閱http://mywiki.wooledge.org/ParsingLs。)

坦率地說,這是大多數shell不容易做的事情。 (例外:zsh,您只需使用sudo rm /home/backup/*(Om[1,-6])。)我會使用其他語言。

1

反引號中的命令將被擴大到相對文件路徑的列表:

%`ls -t /home/backup/ | awk 'NR>5'` 
a.txt b.txt c.txt ... 

這樣完整的命令現在看起來像這樣:

sudo rm /home/backup/a.txt b.txt c.txt 

其中,我認爲,品牌它很明顯爲什麼只有第一個文件被刪除。

還有多項參數的極限可以傳遞給rm,所以 您更好地修改腳本,以使用xargs代替:

ls -t|tail -n+5|xargs -I{} echo rm /home/backup/'{}' 

(只是刪除echo,一旦你驗證,它產生一個預期的結果爲你)