刪除最舊的文件

刪除最舊的文件

我正在嘗試從目錄中刪除舊文件,只留下 3 個最新文件。

cd /home/user1/test

while [ `ls -lAR | grep ^- | wc -l` < 3 ] ; do

    rm `ls -t1 /home/user/test | tail -1`
    echo " - - - "

done

條件語句有問題。

答案1

如果你想循環文件,從不使用ls*。 tl;dr 在許多情況下,您最終都會刪除錯誤的文件,甚至所有文件。

也就是說,不幸的是,在 Bash 中這是一件棘手的事情。有一個可行的答案重複的問題 我甚至更老find_date_sorted您可以稍作修改即可使用:

counter=0
while IFS= read -r -d '' -u 9
do
    let ++counter
    if [[ counter -gt 3 ]]
    then
        path="${REPLY#* }" # Remove the modification time
        echo -e "$path" # Test
        # rm -v -- "$path" # Uncomment when you're sure it works
    fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz) # Find and sort by date, newest first

*無意冒犯大家-我ls以前也用過。但確實不安全。

編輯:新的find_date_sorted與單元測試。

答案2

要使用 zsh glob 刪除除 3 個最新文件之外的所有文件,您可以使用Om(大寫 O)將文件從最舊到最新進行排序,並使用下標來獲取所需的文件。

rm ./*(Om[1,-4])
#    | ||||  ` stop at the 4th to the last file (leaving out the 3 newest)
#    | |||` start with first file (oldest in this case)
#    | ||` subscript to pick one or a range of files
#    | |` look at modified time
#    | ` sort in descending order
#    ` start by looking at all files

其他例子:

# delete oldest file (both do the same thing)
rm ./*(Om[1])
rm ./*(om[-1])

# delete oldest two files
rm ./*(Om[1,2])

# delete everything but the oldest file
rm ./*(om[1,-2])

答案3

到目前為止,最簡單的方法是使用 zsh 及其全域限定符Om依年齡遞減排序(即最老的在前)並[1,3]僅保留前三個匹配項。

rm ./*(Om[1,3])

也可以看看如何在 zsh 中過濾 glob了解更多範例。

並注意l0b0的建議:如果您的檔案名稱包含 shell 特殊字符,您的程式碼將會嚴重崩潰。

答案4

首先,該-R選項用於遞歸,這可能不是您想要的 - 它也會在所有子目錄中搜尋。其次,<運算子(當不被視為重定向時)用於字串比較。你可能想要-lt。嘗試:

while [ `ls -1A | grep ^- | wc -l` -lt 3 ]

但我會在這裡使用 find :

while [ `find . -maxdepth 1 -type f -print | wc -l` -lt 3 ]

相關內容