我的服务器上有一个备份文件夹,其中包含自动生成的文件。它们占用了我 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
使用find
和perl
(谨慎使用,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
(* * * * *
根据您自己的时间规格进行更改)。