linux下面一个根目录,里面包含文件和多级子目录,要求一个shell脚本,将根目录下所有东西改为指定的用户和组。
以上实现很简单,chown -R ..就行了。
但是有要求:
1.根目录和用户/组是运行时指定的
(1) 根目录必须指定,例如(/temp)
(2) 用户/组可以指定,如果不指定,默认是nobody:nobody
2.需要记录Log
(1)采用深度(DFS)遍历的方法(或者你认为适合的方式),一个个给每个文件/目录修改
(2)每修改完成一个都需要写一条记录:"xxx文件(目录)已修改完成"
(2)记录写到/opt/record.log里面
希望能给出注释,先给100分,如果好用,再加100-200分,决不食言
#!/bin/sh
#用户交互,输入目录和用户名与组
read -p "请指定目录:" dir
read -p "请指定用户和组,如(root:root):" ugid
#判断目录与用户组输入并处理
if [[ $dir == '' ]];then #判断目录是否为空
echo "目录不允许为空,请重新指定" && exit 1
elif [[ $ugid == '' ]];then #判断用户组是否为空
ugid="nobody:nobody" #为空则指定用户与组为nobody:nobody
fi
#
for list in $(find $dir) #遍历该目录
do
[[ -f $list ]] && chown $ugid $list && echo "文件$list已修改完成" >> /opt/record.log #判断该条是否为文件
[[ -d $list ]] && chown $ugid $list && echo "目录$list已修改完成" >> /opt/record.log #判断该条是否为目录
done
给我邮箱。。追问
1.没bug(这个是基本的) 2.脚本处理性能尽量好一点(因为里面文件非常大,所以可能会出错,这也是为什么需要记录Log)
wsg8cs@gmail.com
没bug,我口气没这么大。你的系统支持中文字符么?我不想用英语写注释。
已经发送。
#!/bin/bash
DIR=''
ATTR='nobody:nobody'
while getopts "o:d:l:h" arg #选项后面的冒号表示该选项需要参数
do
case $arg in
o)
ATTR="$OPTARG" #参数存在$OPTARG中
;;
d)
DIR="$OPTARG"
;;
h)
cat /opt/record.log 2>&1
EOF
exit 0
;;
?)
#当有不认识的选项的时候arg为?
echo "unkonw argument" >&2
exit 1
;;
esac
done
if [ -z "$DIR" ];then
echo "Must use -d to set DIR." >&2
exit 1
fi
TMP=$(mktemp /tmp/chmod.XXXXXX.tmp)
DIR=$(readlink -m $DIR)
#将DIR转换成绝对路径。
find $DIR > "$TMP"
#将DIR下的目录结构写到临时文件中。
#下面的循环用来从临时文件中读取需要文件列表。
while read LINE
do
if chown $ATTR $LINE 1>/dev/null 2>&1 ;then
echo "$LINE 修改完成 "
else
echo "$LINE 修改失败 " >&2
fi
done <"$TMP"
rm -f $TMP
exit 0