
我正在尋找一個 Bash 腳本,該腳本將進入目錄列表並刪除除最近創建的四個文件之外的所有文件。
我怎樣才能做到這一點?
答案1
ls -t | sed '1,4d' | xargs echo rm
echo
當您滿意這就是您想要的結果時,請刪除。
如果您的檔案名稱包含空格,則需要更多工作。
答案2
您想保留每個目錄中的四個最新文件,還是任何目錄中的四個最新文件?
要解決第一個問題,您可以使用 find 列出每個目錄,然後在每個目錄中刪除除四個最新檔案之外的所有檔案。這並不太難。
解決第二個問題需要更多的思考,但實際上更容易編寫。
基本上,遞歸地查找每個文件。呼叫“stat”命令返回檔案的修改時間和名稱。按數字降序排序,並跳過前四個文件,這是最新的。
然後刪除前導時間戳,並刪除產生的檔案名稱清單。
像是(未經測試)的東西:
#!/bin/bash
find "$@" -type f -print0 \
| xargs -0 stat -c$'%Y\t%n' \
| sort -rn \
| awk -F$'\t' 'NR > 4 {print $2}' \
| while read f; do
echo rm -v "${f}"
done
這應該可行,儘管您需要刪除 while 循環中的“echo”以使其有效。先仔細測試一下!
答案3
我意識到這並不完全是您所要求的,但對於這種備份,我更喜歡在創建新文件之前輪換日誌檔案。它更明確一些,並且編碼更簡單,如下所示:
#!/bin/bash
#Archive old backups
move () {
if [ -e $1 ]
then
echo "Archiving old backups: $1 to $2"
mv -f $1 $2 || echo "FAILED"
fi
}
#Bump each backup +1
rm -rf backup.4
move backup.3.tgz backup.4.tgz
move backup.2.tgz backup.3.tgz
move backup.1.tgz backup.2.tgz
move backup.tgz backup.1.tgz
#Now create today's backup
...
答案4
最簡單的方法:
for d in dir1 dir2 dir3; do
rm -vf `ls -1t $d | head -n-4`
done