Bash 在保存到文件的目录列表中查找
我正在使用一个小Bash脚本定期清除旧备份:Bash 在保存到文件的目录列表中查找,bash,find,xargs,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可能无法删除它们。因此,我需要在rm之前运行chmod,以更改
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
可能无法删除它们。因此,我需要在rm
之前运行chmod
,以更改其权限:
xargs --no-run-if-empty --null --arg-file $FILE_LIST chmod -vR 700
但这是低效的,因为它对找到的目录中的所有文件调用chmod
,而绝大多数文件可能不需要chmoded。理想情况下,我想再次调用find
,这次是使用-perm-u+w
并仅在$FILE\u列表中包含的目录中搜索
实现这一目标的最佳方式是什么?我基本上是在寻找一些东西来复制xargs
的--arg file
选项的功能
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 {} \;
我希望这能解决问题有一种方法可以做到这一点-我们可以链接xargs
-查找-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
如果需要,可以在chmod
之前添加sudo
。如果sudo在这种情况下是paswdless就好了这种方法的问题是它需要两次执行find
,但是需要chmod的文件是第一次运行find
时找到的文件的子集。这就是为什么我想将第二次搜索限制为以前找到的那些文件。