2016-10-18 45 views
2

我有這個bash腳本作爲每小時運行一個crontab。我想在文件夾中保留最新的1,000張圖像,刪除最舊的文件。我不想通過mtime進行刪除,因爲如果沒有新文件上傳,我想保留它們,如果圖像是1天或50天的舊圖像,我只想在圖像1,001上傳時更新(最新)image_1 (最舊)將被刪除,循環瀏覽文件夾以保持靜態數量的1,000張圖像。保持最新x文件數量刪除休息打擊

這是有效的,但是在任何時候,執行時可能會有1,200個。每分鐘運行一次crontab似乎都是過分的。我可以做到這一點,一旦文件夾命中1,001圖像它自動執行?基本上我想讓文件夾自我掃描並保留最新的1,000張圖像,刪除最舊的圖像。

#!/bin/sh 
cd /folder/to/execute; ls -t | sed -e '1,1000d' | xargs -d '\n' rm 
+0

您爲了添加新文件而遵循的方式是什麼? –

+0

這是從用戶上傳的圖像。這是一個聊天,當他們上傳時,它會被上傳爲username_timestamp(.gif/jpg/png),這個laravel php框架正在通過聊天進行實際的圖片上傳。所以它會是隨機的,一分鐘50張圖像,或者每天50張圖像。 編輯: 此腳本通過時間戳省略最新的1,000個文件,然後只刪除文件夾中剩下的任何內容。 –

+0

如何編寫某種webhook或本地腳本來檢查上載圖像後的圖像總數?那麼當它命中1000時會觸發shell命令?這是否也是一種矯枉過正? –

回答

0
keep=10 #set this to how many files want to keep 
discard=$(expr $keep - $(ls|wc -l)) 
if [ $discard -lt 0 ]; then 
    ls -Bt|tail $discard|tr '\n' '\0'|xargs -0 printf "%b\0"|xargs -0 rm -- 
fi 

這首先計算文件數刪除,然後安全地將它們傳遞給rm。它故意使用負數,因爲它方便地作爲tail的參數。

使用trxargs -0是爲了確保即使文件名包含空格也可以使用。 printf位用於處理包含換行符的文件名。

編輯:添加--rm args設置爲是安全的,如果任何文件被用連字符刪除開始。

+0

這種方式完美無缺,只是順序相反。它保留了10個最舊的文件。但是謝謝你!這回答了我的問題。這就是我需要的,現在我需要編輯來保留最新的文件。 –

+0

你能告訴我你是如何得到這個結果的嗎?我已經通過讀取輸出在本地進行了測試,然後通過在具有相隔一秒的19個文件的目錄中實際使用它進行測試。它刪除了最老的文件給我(因爲它應該感謝'tail')。 – Eric

+0

對不起eric。我正在使用一個腳本來生成文件來測試,並表示腳本生成速度如此之快,時間戳是相同的。造成這種混亂。 –

0

請嘗試以下script.It首先檢查計數在當前目錄下,然後,如果計數大於1000,其評價差異,然後得到的最古老的此類文件。

#/bin/bash 
    count=`ls -1 | wc -l` 
    if [ $count -gt 1000 ] 
    then 
    difference=${count-1000} 
    dirnames=`ls -t * | tail -n $difference` 
    arr=($dirnames) 
    for i in "${arr[@]}" 
     do 
     echo $i 
     done 
    fi 
+0

我做錯了什麼?我創建了2,000個文本文件,並運行了bash腳本。它只是輸出一個文件「1000」,並像運行貓一樣以bash的形式列出每個文件。 http://i.imgur.com/McuD6vY.png 我嘗試了1500次,以確保它不是我的目標,結果相同。 http://i.imgur.com/FxrqXHZ.png 感謝您的快速響應! –

+0

如果我正確地得到它,你想創建比最新的1000個文件更早的文件? – Rambler

+0

我想掃描文件夾,如果有超過1,000個文件,請先刪除舊文件,直到剩下1000個文件。保持最新的1,000個文件。 –