我写了这个脚本:
#!/bin/bash
DAYSOLD="2"
users_dir="/users"
cd $users_dir
date >> cleanup.log; du -h --max-depth=1 | sort -hr >> cleanup.log
find $users_dir -mtime +$DAYSOLD -type f -exec rm -v {} \;
我只想删除“workspace”目录下超过 2 天的文件。这应该怎么做呢?
/users/user1/workspace
/users/user2/workspace
/users/user3/workspace
谢谢你的帮助。我很想学习如何做到这一点。
答案1
-mtime "+$days"
选择年龄(基于上次修改时间)四舍五入的文件向下整数天数是严格地比...更棒$days
。
2 天 23 小时前的文件不会被选择,-mtime +2
因为它被认为是 2 天前的文件,且不大于2
.
所以你需要:
find "$users_dir"/*/workspace -mtime "+$(( DAYSOLD - 1 ))" -type f -delete
要删除$DAYSOLD
在workspace
.$users_dir
虽然你也可以这样做:
find "$users_dir"/*/workspace '(' -mtime "$DAYSOLD" -o -mtime "+$DAYSOLD" ')' \
-type f -delete
它将删除年龄(以整数天为单位)等于$DAYSOLD
或大于 的文件$DAYSOLD
。
-delete
是一个非标准扩展,但可以在find
Ubuntu 上的 GNU 中使用,并且比使用-exec rm
.-delete -print
如果您想要已成功删除的文件列表,则可以制作。
还记得要引用你的变量cd
并在携带1之前检查退出状态:(cd -P -- "$users_dir" && exec du...)
否则du
如果失败将在错误的目录中运行cd
。另请注意子 shell 的使用,否则如果$users_dir
是相对路径,它将无法正常工作。实际上将其写为更有意义:
cd -P -- "$users_dir" || exit
du ...
find . ...
$users_dir
(如果是符号链接,则会更加一致)
严格来说,就是至少$DAYSOLD
几天前但考虑到比较是使用纳秒精度完成的,并且需要几百纳秒才能开始find
,这种区别几乎没有意义。
² 严格来说,ifworkspace
是一个非类型的文件目录,它仍然会被传递到find
,如果该文件早于$DAYSOLD
几天(并且是 的常规文件-type f
),它也将被删除。您可以切换到zsh
并添加(/)
到该模式,以确保仅workspace
考虑目录类型的文件。做不是只需附加,/
因为您会遇到下面的 ³ 并产生更严重的后果(例如何时是or 的/users/joe/workspace
符号链接)。/bin
/
³ 请注意,此处后面跟着符号链接。例如,如果/users/joe
是符号链接/
,则会删除/workspace
目录中的旧文件。
答案2
尝试用这个
find $users_dir/user*/workspace -mtime +$DAYSOLD -type f -exec echo rm -v {} \;
如果它达到了你的预期,就会降低回声。如果您想将日期视为从午夜开始,请考虑添加 -daystart
另一种简单的方法是使用 -path
find $users_dir -path "$users_dir/user*/workspace/*" -mtime +$DAYSOLD -type f -exec echo rm -v {} \;