在文件夹中保留 2 个最新文件并删除其他文件

在文件夹中保留 2 个最新文件并删除其他文件

我的服务器上有一个备份文件夹,其中包含自动生成的文件。它们占用了我 100% 的磁盘空间。所以我需要创建一个 cron 来删除所有文件但保留 2 个最新文件。

我找到了一个可以做到这一点的代码,但不知道如何运行它。

(temp_all=$(mktemp) && temp_last=$(mktemp) && { tac | tee $temp_all | sort -un > $temp_last ; } && grep -vf $temp_last $temp_all ; rm -f $temp_last $temp_all)

我应该怎么办?创建一个 .sh 文件并使用参数运行它?我该怎么做?

这段代码可以满足我的需要吗?

提前致谢!

答案1

使用findperl谨慎使用unlink删除文件):

(可以处理各种类型的文件:带有换行符、空格...)

$ ls -ltr
total 0
-rw-rw-r-- 1 stardust stardust 0 févr. 14 00:21 foo
-rw-rw-r-- 1 stardust stardust 0 févr. 14 00:21 bar
-rw-rw-r-- 1 stardust stardust 0 févr. 14 00:21 base
-rw-rw-r-- 1 stardust stardust 0 févr. 14 00:21 qux

$ find /path/to/dir -type f -printf '%T@ %p\0' | 
      sort -z -nk1 |
      perl -0 -ne '
          m|\s+(\./.*)|ms and push(@files, $1);
          END{unlink for @files[0..($#files - 2)]}'

$ ls -ltr
total 0
-rw-rw-r-- 1 stardust stardust 0 févr. 14 00:21 base
-rw-rw-r-- 1 stardust stardust 0 févr. 14 00:21 qux

在 crontab 中使用:

创建一个脚本(只需复制并粘贴到 shell 中):

install -D -m755 /dev/null ~/bin/remove_files_except_2_last_ones
cat<<EOF > ~/bin/remove_files_except_2_last_ones
#!/bin/sh

. ~/.bashrc # or any other *rc file, to set PATH variable

find /path/to/dir -type f -printf '%T@ %p\0' | 
    sort -z -nk1 |
    perl -0 -ne '
        m|\s+(\./.*)|ms and push(@files, $1);
        END{unlink for @files[0..($#files - 2)]}'    
EOF
crontab -e

然后粘贴:

* * * * * ~/bin/remove_files_except_2_last_ones &>/tmp/2_last_ones.log

* * * * *根据您自己的时间规格进行更改)。

相关内容