![](/img/trans.png)
[英]How can I delete files over (n) days old but leave (n) files regardless of age?
[英]How can I delete the oldest n group of files with the same prefix?
在 Linux 中,我使用 InfluxDB,它可以為存檔目的備份數據庫。 每個備份包含一系列具有相同前綴“/tank/Backups/var/Influxdb/20191225T235655Z”的文件。 和不同的擴展。
我想編寫一個 bash 腳本,它首先刪除最舊的現有備份,然后創建一個新備份(這里我只粘貼刪除):
ls -tp /tank/Backups/var/Influxdb/* | grep -v '/$' | sed -E 's/\..+//' | \
sort -ru | sed 's/$/.*/' | tail -n +4 | xargs -d '\n' -r rm --
但是,當我以“sudo”運行腳本時,我得到
rm: cannot remove '/tank/Backups/var/Influxdb/20191225T235655Z.*': No such file or directory
當我運行引用的腳本時,除了最新的部分,我得到:
/tank/Backups/var/Influxdb/20190930T215357Z.*
/tank/Backups/var/Influxdb/20190930T215352Z.*
哪個是正確的。 另外,如果我手動編寫
sudo /tank/Backups/var/Influxdb/20190930T215357Z.*
命令成功。
為什么腳本會報錯?
我使用的是 Ubuntu 18.04,文件夾“/tank”是一個 ZFS 卷。
最好這樣做:
find /tank/Backups/var/Influxdb/* -mtime +5 -delete
刪除超過 5 天的文件。
然后,您可以運行下一個命令
這個答案只是在這里解釋錯誤並更深入地了解正在發生的事情。 如果您只是在尋找優雅的解決方案,請搜索其他答案。
當我運行引用的腳本時,除了最新的部分,我得到:
/tank/Backups/var/Influxdb/20190930T215357Z.* /tank/Backups/var/Influxdb/20190930T215352Z.*
哪個是正確的
列出的字符串不是您想要的。 當您將這些路徑傳遞給rm
它會將它們視為文字字符串,即名稱以文字*
結尾的兩個文件。 由於您沒有此類文件,因此您會收到錯誤消息。
當您在控制台中手動鍵入rm *
bash
(不是rm
!)會進行globbing 。 bash
搜索文件並將*
替換為找到的文件列表。 只有在bash
執行rm foundFile1 foundFile2 ...
。 rm
永遠不會看到*
。
管道內的字符串不由bash
處理,而是由管道中的命令處理,在您的情況下為rm
。 rm
不通。
您可以在管道中運行bash
並讓它擴展您之前插入的*
。 為此,將管道中的最后一個命令替換為xargs -r bash -c 'rm -- $*' --
。 但是,請注意,此處未引用您的路徑。 如果文件名中有空格或文字*
命令將中斷。 這對於通配符是必要的,因為引用的"*"
不會被bash
擴展。
要引用您的文件,您必須在 bash 命令中插入*
glob:
ls -tp /tank/Backups/var/Influxdb/* | grep -v '/$' | sed -E 's/\..+//' |
sort -ru | tail -n +4 | xargs -d\\n -L1 -r bash -c 'rm -- "$0."*'
上面的命令只是對您的命令的簡單修復。 它既不優雅也不非常堅固。 強烈建議使用find
工具。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.