删除除每天最新的所有文件

mic*_*lbn -1 linux bash shell-scripting

我有定期更新的转储目录。

我想删除所有超过一周的文件。

Bash 是首选,但也欢迎其他解决方案。

pet*_*erh 5

诀窍是--full-time标志,它可以提供给ls命令,它返回一个文件列表,其中包含非常容易编写脚本的日期字段。我们可以轻松地按日期对其进行排序。

$ ls -l --full-time|sort -k +7
-rwxr-xr-x  1 cica cica  16536 2014-07-10 10:47:32.448349200 +0200 epl-v10.html
-rwxr-xr-x  1 cica cica   9013 2014-07-10 10:47:32.495149500 +0200 notice.html
drwxr-xr-x+ 1 cica cica      0 2014-07-07 14:12:11.502336700 +0200 readme
drwxr-xr-x+ 1 cica cica      0 2014-07-31 14:38:20.800181400 +0200 p2
drwxr-xr-x+ 1 cica cica      0 2014-07-31 15:15:06.506730000 +0200 features
drwxr-xr-x+ 1 cica cica      0 2014-07-31 15:15:06.680747400 +0200 plugins
-rw-r--r--  1 cica cica 368634 2014-07-31 15:15:06.826762000 +0200 artifacts.xml
-rw-r--r--  1 cica cica    329 2014-07-31 15:15:12.816360900 +0200 eclipse.ini
-rwxr-xr-x  1 cica cica   7929 2014-07-14 16:01:58.698363500 +0200 system_catalog.xml
drwxr-xr-x+ 1 cica cica      0 2014-07-31 17:41:59.205940000 +0200 configuration
-rwxr-xr-x  1 cica cica 312320 2014-06-01 20:12:16.000000000 +0200 eclipse.exe
-rwxr-xr-x  1 cica cica  17920 2014-06-01 20:12:16.000000000 +0200 eclipsec.exe
Run Code Online (Sandbox Code Playgroud)

首先,我们对它进行排序通过 日期

诀窍是,在每天最后一个文件之后,日期字段将在上一行之后重播。这可以由 awk 轻松处理。

其次,我们将其进一步简化为一个简单的 awk 脚本: awk '{if ($6 == EX) print $9; EX=$6}'

最后,我们使用xargslet使用rm命令删除每个文件。

完整的命令是:

ls -l --full-time|sort -k +6|awk '{if ($6 == EX) print $9; EX=$6}'|xargs -P 1 -n 1 echo rm -vf
Run Code Online (Sandbox Code Playgroud)

此命令是您需要定期调用的命令,最好是从 cron 调用。理想情况下,您可以放弃crontab -e,您每天在 2:37 调用它:

37 2 * * *     ls -l --full-time|sort -k +6|awk '{if ($6 == EX) print $9; EX=$6}'|xargs -P 1 -n 1 echo rm -vf
Run Code Online (Sandbox Code Playgroud)

当然,您可以将其放入脚本中,然后仅从 cron 调用该脚本。

  • 顺便说一句,linux find 有一个 -delete 选项,非常方便 (4认同)
  • 嗯,还是不行。一周后,他想删除所有**除了每天最年轻(最新)的文件**。 (2认同)