在保存到文件的目录列表中查找

时间:2014-05-09 10:24:46

标签: bash find xargs

我正在使用一个小的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}}选项功能的东西。

2 个答案:

答案 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