我正在使用一个小的Bash脚本来定期清除旧备份:
FILE_LIST=`mktemp --suffix=.list`
find . -maxdepth 1 -type d -mtime +30 -print0 > $FILE_LIST
xargs --no-run-if-empty --null --arg-file $FILE_LIST rm -rvf
rm -f $FILE_LIST
然而,问题是文件不能保证是用户可写的,因此rm
可能无法删除它们。因此,我需要在chmod
之前运行rm
才能更改其权限:
xargs --no-run-if-empty --null --arg-file $FILE_LIST chmod -vR 700
但这是低效的,因为它在找到的目录中的所有文件上调用chmod
,而绝大多数文件可能不需要进行编码。理想情况下,我想再次调用find
,这次使用! -perm -u+w
并仅搜索$FILE_LIST
中包含的目录。
实现这一目标的最佳方法是什么?我基本上在寻找能够复制xargs
的{{1}}选项功能的东西。
答案 0 :(得分:1)
find . -maxdepth 1 -type d -mtime +30 -writable -exec rm -rf {} \;
然后
find . -maxdepth 1 -type d -mtime +30 -exec chmod u+w {} \; -exec rm -rf {} \;
我希望这能解决目的
答案 1 :(得分:0)
有一种方法可以做到 - 我们可以链xargs
- find
- xargs
- chmod
:
# Find unwritable files and chmod them
xargs -I {} -0r -a $FILE_LIST find {} ! -perm -u+w -print0 | xargs -0r chmod -R 700 -v
因此,完整的Bash脚本将是:
FILE_LIST=`mktemp --suffix=.list`
find ~/udit65_backup/ -maxdepth 1 -iname "$PREFIX-*" -type d -mtime +$NDAYS -print0 > $FILE_LIST
# Make unwritable files... writable
xargs -I {} -0r -a $FILE_LIST find {} ! -perm -u+w -print0 | xargs -0r chmod -R 700 -v
xargs -0r -a $FILE_LIST rm -rf -v
rm -f $FILE_LIST