Linux

查找以 YYYY-MM-DD 命名的早於 X 天的目錄,如果存在則刪除

  • February 16, 2022

X我嘗試創建一個 bash 內襯腳本,該腳本根據文件名查找並刪除早於幾天的目錄,如果目錄存在,則程式碼可以完美執行。唯一的問題是,如果目錄不存在,它會嘗試刪除它並出錯:

find: ‘/var/www/html/resources/cache/2022-02-08’: No such file or directory

雖然我已經在 find 命令的結果中設置了檢查目錄是否存在然後刪除它的條件。

find '/var/www/html/resources/cache/' -type d -name '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' -exec sh -c 'd={}; [ "$(date -d "6 days ago" +%Y-%m-%d)" ">" "$(basename $d)" ] && [ -d $d ] && rm -rf $d' \;

假設我有以下目錄位於/var/www/html/resources/cache

2022-02-08
2022-02-09
2022-02-10
2022-02-11
2022-02-12
2022-02-13
2022-02-14
2022-02-15

[ "$(date -d "6 days ago" +%Y-%m-%d)" ">" "$(basename $d)" ]檢查文件名是否超過 6 天

[ -d $d ]檢查它是否是一個目錄

您可以使用xargs命令而不是-exec選項find

find '/var/www/html/resources/cache/' -type d -name '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' | xargs -I {} sh -c 'd={}; [ "$(date -d "6 days ago" +%Y-%m-%d)" ">" "$(basename $d)" ] && [ -d $d ] && rm -rf $d'

上面的程式碼塊可以工作,但它可能會123作為值返回。 當任何重複的命令出錯時,xargs命令返回。123因此,如果甚至一個目錄名稱不是六天前,就會發生錯誤。

find '/var/www/html/resources/cache/' -type d -name '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' | xargs -I {} sh -c 'd={}; if [ "$(date -d "6 days ago" +%Y-%m-%d)" ">" "$(basename $d)" ]; then [ -d $d ] && rm -rf $d; fi'

您可以用語句替換條件if來解決此問題。

引用自:https://unix.stackexchange.com/questions/690736