【问题标题】:Unable to Delete Directories Older Than Three Days无法删除超过三天的目录
【发布时间】:2016-08-03 09:48:41
【问题描述】:

我需要删除所有超过三天的子目录。下面的代码应该可以工作,但它不是......

for i in `find ~/web/smsng/ -maxdepth 1 -type d -mtime +3 -print`; do echo -e "Deleting directory $i";rm -rf $i; done

完整的ls-l目录列表:

(uiserver):u83749873:~/models/ndfd > ls -l
total 1536
drwx---r-x 2 u83749873 ftpusers 12288 Apr  8 12:41 2016040816
drwx---r-x 2 u83749873 ftpusers 12288 Apr  8 13:41 2016040817
drwx---r-x 2 u83749873 ftpusers 12288 Apr  8 14:40 2016040818
drwx---r-x 2 u83749873 ftpusers 12288 Apr  8 15:41 2016040819
drwx---r-x 2 u83749873 ftpusers 12288 Apr  9 00:41 2016040904
drwx---r-x 2 u83749873 ftpusers 12288 Apr  9 01:41 2016040905
drwx---r-x 2 u83749873 ftpusers 12288 Apr  9 02:41 2016040906
drwx---r-x 2 u83749873 ftpusers 12288 Apr  10 03:41 2016040907
drwx---r-x 2 u83749873 ftpusers 12288 Apr  10 04:41 2016040907
drwx---r-x 2 u83749873 ftpusers 12288 Apr  11 07:41 2016040907

【问题讨论】:

  • 为什么不查找find 的手册页并注意exec 选项
  • 你能给我们一个~/web/smsng/的完整目录列表吗(使用ls -l)?请记住,当文件名更改时,目录计为modified
  • @EdHeal 只要路径名中没有空格或转义字符,此代码应该可以正常工作。
  • @AaronPerry 我说给我一个清单。如列出目录的内容。即ls -l ~/web/smsng/。你可以把它放在你的问题正文中。
  • 所以,如果我只想要最后三天,我会将-mtime +3 更改为-mtime +2

标签: linux bash unix server rm


【解决方案1】:

-mtime +3 更改为-mtime +2

for i in `find ~/web/smsng/ -maxdepth 1 -type d -mtime +2 -print`; do
    echo -e "Deleting directory $i"
    rm -rf $i
done

根据 find(1) 手册页:

-mtime n

文件最后一次访问是在 n*24 小时前。当找出最后一次访问文件的时间是多少 24 小时前,任何小数部分都将被忽略,因此要匹配 -atime +1,文件必须至少在 两天 天前被访问.

其他改进

您可以对脚本进行一些改进,以提高处理任何可能文件名的能力。

目前,如果出现以下情况,您的脚本将无法运行:

  • 任何目录中都有空格、制表符或换行符
  • $i 变量以连字符 (-) 开头

如果您像这样编写脚本,则可以解决这两个问题:

find ~/web/smsng/ \
    -maxdepth 1 -type d -mtime +2 \
    -exec echo 'Deleting directory {}' \; \
    -exec rm -rf -- {} \;

因为它从来没有被 shell 解释为一个参数列表,所以从来没有发生过空格分割。因为它通过选项终止-- 传递给rm,所以文件名可以以连字符开头并且不会被解释为rm 的标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2010-12-08
    相关资源
    最近更新 更多