【问题标题】:Linux clean directory scriptLinux 清理目录脚本
【发布时间】:2012-08-21 20:06:21
【问题描述】:

我需要为 Web 服务器编写一个脚本,该脚本将清除超过 14 天的文件/文件夹,但保留最后 7 个文件/目录。到目前为止,我一直在做我的研究,这就是我想出的(我知道语法和命令是不正确的,但只是为了让你明白):

ls -ldt /data/deployments/product/website.com/*/ | tail -n +8 | xargs find /data/deployments/product/website.com/ -type f -type d -mtime +14 -exec rm -R {} \;

这是我对脚本应该如何表现的思考过程(我更喜欢 Windows 批处理):

列出目录内容

 If contents is less than or equal to 7, goto END
 If contents is > 7 goto CLEAN
:CLEAN
ls -ldt /data/deployments/product/website.com/*/
keep last 7 entries (tail -n +8)
output of that "tail" -> find -type f -type d (both files and directories) -mtime +14 (not older than 14 days) -exec rm -R (delete)

我看过一堆例子,使用 xargs 和 sed,但我就是不知道如何将它们组合在一起。

【问题讨论】:

  • 什么决定了 7 个保留的文件是什么?
  • 你应该看看logrotate
  • “清除超过 14 天的文件/文件夹,但保留最后 7 个文件/目录”这是否意味着:“如果文件的使用期限小于 14 天,或者如果它是目录中有 7 个最新文件”?
  • 这意味着在指定位置必须至少有 7 个目录。如果超过 7 个,清除最旧的,最多 14 天。

标签: linux bash scripting ls


【解决方案1】:
#!/bin/bash

find you_dir -mindepth 1 -maxdepth 1 -printf "%T@ %p\n" | \
sort -nrk1,1 |sed '1,7d' | cut -d' ' -f2 | \
xargs -n1 -I fname \
find fname -maxdepth 0 -mtime +14 -exec echo rm -rf {} \;

如果您对输出感到满意,请删除 echo...

解释(逐行):

  1. find 正好在 your_dir 中,并在单独的行上为每个文件/目录打印 seconds_since_Unix_epoch (%T@) 和文件(/目录)名称
  2. 按第一个字段 (seconds_since_Unix_epoch) 降序排序,去掉前七行 - 从其余部分中提取名称(第二个字段)
  3. xargs 传递给新的 find 逐个参数处理 (-n1) 并使用 fname 表示参数
  4. -maxdepth 0find 限制为仅 fname

您可以将 minNrOfFiles 和 ageLimit 存储在 Bash-Variables 中,或者只需进行少量更改即可传递给脚本:

minNrOfFiles=7 # or $1
ageLimit=14    # or $2

更改:sed '1,'"$minNrOfFiles"'d'-mtime +"$ageLimit"

【讨论】:

  • 感谢您的脚本。但是,它并没有离开 7 个目录。我不会删除所有内容,但我不希望它删除它不应该删除的东西。例如,我正在运行脚本的当前目录,它包含 5 个文件和 5 个目录。当我运行你的脚本时,它给了我 3 个确实超过 14 天的文件夹。但是,文件夹总数少于 7 个,因此脚本不应删除任何内容。请指教。谢谢
  • 请阅读您自己的问题:它声明“...保留最后 7 个文件/目录 ...”。这正是您报告的内容:您有 5 个文件 + 5 个目录(=10 个实体),脚本删除了 3 个最旧的 14 天以上(剩下 7 个)
  • 哦,我明白了。该路径中的目录是 tar.gz 文件的结果,因此,我需要运行两个单独的脚本:一个用于处理目录的脚本,一个用于处理文件的脚本。我怎样才能编辑这个脚本来做到这一点?谢谢!
猜你喜欢
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
相关资源
最近更新 更多