簡體   English   中英

如何刪除最舊的 n 組具有相同前綴的文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM