之前寫過 Delete None Keeping File 這篇,用來刪除固定數量的保存檔案,使用的是 ls
,今天使用 find 來達成一樣的效果。
首先我們來建二十個以 0.05 秒間距不同的檔案:
for i in {1..20}; do touch "${i}.log"; sleep 0.05; done
列出檔案一下目前排序是這樣。
0 Oct 15 23:56 1.log 0 Oct 15 23:56 10.log 0 Oct 15 23:56 11.log 0 Oct 15 23:56 12.log 0 Oct 15 23:56 13.log 0 Oct 15 23:56 14.log 0 Oct 15 23:56 15.log 0 Oct 15 23:56 16.log 0 Oct 15 23:56 17.log 0 Oct 15 23:56 18.log 0 Oct 15 23:56 19.log 0 Oct 15 23:56 2.log 0 Oct 15 23:56 20.log 0 Oct 15 23:56 3.log 0 Oct 15 23:56 4.log 0 Oct 15 23:56 5.log 0 Oct 15 23:56 6.log 0 Oct 15 23:56 7.log 0 Oct 15 23:56 8.log 0 Oct 15 23:56 9.log
用預設的 find 查詢一下檔案內容。
find . -type f -name "*.log" ./10.log ./8.log ./19.log ./14.log ./13.log ./9.log ./2.log ./20.log ./1.log ./17.log ./6.log ./15.log ./12.log ./16.log ./4.log ./5.log ./11.log ./7.log ./18.log ./3.log
有人可能會說那利用 sort 不就可以自然排序正確的數字,沒錯,但那是因為我們的檔名自然有序,若遇到實際上沒有這樣結構的檔案,或者萬一臨時修改了檔名造成新排序不是我們要的結果就會出問題,所以最保險的方法還是利用日期去自然排序。
我們利用 -printf
這個指令來達到目的。
find . -type f -name "*.log" -printf "%T+ %p\n" | sort 2022-10-15+23:56:20.1777708840 ./1.log 2022-10-15+23:56:20.2297708850 ./2.log 2022-10-15+23:56:20.2817708850 ./3.log 2022-10-15+23:56:20.3337708860 ./4.log 2022-10-15+23:56:20.3857708860 ./5.log 2022-10-15+23:56:20.4457708870 ./6.log 2022-10-15+23:56:20.5057708880 ./7.log 2022-10-15+23:56:20.5697708880 ./8.log 2022-10-15+23:56:20.6337708890 ./9.log 2022-10-15+23:56:20.6817708890 ./10.log 2022-10-15+23:56:20.7377708900 ./11.log 2022-10-15+23:56:20.7977708910 ./12.log 2022-10-15+23:56:20.8457708910 ./13.log 2022-10-15+23:56:20.9057708920 ./14.log 2022-10-15+23:56:20.9577708920 ./15.log 2022-10-15+23:56:21.0217708930 ./16.log 2022-10-15+23:56:21.0977708940 ./17.log 2022-10-15+23:56:21.1617708950 ./18.log 2022-10-15+23:56:21.2137708950 ./19.log 2022-10-15+23:56:21.2617708960 ./20.log
printf
詳細用法可以參考 How to Use find -printf in Linux?,非常的強大,其他工作就可以接續 Delete None Keeping File 處理。
find . -type f -name "*.log" -printf "%T+ %p\n" | sort -r | awk '{print $NF}' | tail -n +11 ./10.log ./9.log ./8.log ./7.log ./6.log ./5.log ./4.log ./3.log ./2.log ./1.log
上方指令搭配 xargs rm -f
就可以只保留最新的十份檔案。
沒有留言:
張貼留言