编写一个shell脚本,自动将用户目录下所有小于5k的文件打包成tar.gz(提示需要配合ls和grep命令。)
2个回答
展开全部
#!/bin/bash
tarname=usr.tar.gz
cd ~
rm $tarname 2>/dev/null
for info in *
do
file=`ls -l $info|grep -e ^-..*$`
if [ -n "$file" ]; then
fsize=`echo "$file"|awk '{print $5}'`
else
continue
fi
if [ $fsize -lt 5000 ]; then
fname=`echo "$file"|awk '{print $NF}'`
flist=$flist" "$fname
fi
done
tar czf $tarname $flist
[ $? -eq 0 ] && echo "Done, archived to ~/$tarname!!"
exit 0
脚本不考虑子目录内容。
tarname=usr.tar.gz
cd ~
rm $tarname 2>/dev/null
for info in *
do
file=`ls -l $info|grep -e ^-..*$`
if [ -n "$file" ]; then
fsize=`echo "$file"|awk '{print $5}'`
else
continue
fi
if [ $fsize -lt 5000 ]; then
fname=`echo "$file"|awk '{print $NF}'`
flist=$flist" "$fname
fi
done
tar czf $tarname $flist
[ $? -eq 0 ] && echo "Done, archived to ~/$tarname!!"
exit 0
脚本不考虑子目录内容。
追问
你好,不知你有没有执行过,我执行的环境为RHEL5.6,结果提示else附近有错,我看不出错在哪。另外有几处不明之处
1、rm $tarname 2>/dev/null //意义和作用
2、file=`ls -l $info|grep -e ^-..*$` //这个 ^-..*$规则什么意思
3、if [ -n "$file" ] then //-n "$file" 是什么意思
4、fsize=`echo "$file"|awk '{print $5}'` //awk '{print $5}' 能找出文件大小?
追答
我用户目录下东西很多,所以我是在用户目录下建了个子目录,用子目录来试验的,我这里验证通过了。结果提示else附近有错,可能你的shell不支持continue命令,改一下脚本吧:
#!/bin/bash
tarname=usr.tar.gz
cd ~
rm $tarname 2>/dev/null
for info in *
do
file=`ls -l $info|grep -e ^-..*$`
if [ -n "$file" ]; then
fsize=`echo "$file"|awk '{print $5}'`
if [ $fsize -lt 5000 ]; then
fname=`echo "$file"|awk '{print $NF}'`
flist=$flist" "$fname
fi
fi
done
tar czf $tarname $flist
[ $? -eq 0 ] && echo "Done, archived to ~/$tarname!!"
exit 0
1、tar包是放在用户目录下的,所以每次运行脚本打包用户目录文件前需要先删除以前生成的tar包(如果不存在也不显示错误信息)。
2、^-..*$ 是正则表达式规则,表示以 - 开头的一行(如果是目录,则以 d 开头,你可以在用户目录下 ls -l 看一下)。. 表示任意一个字符,*表示匹配前面的0个或多个字符。你网上搜一下Linux shell正则表达式就知道了。
3、[ -n "$file" ] 这是测试语句,判断字符串是否非空。上面一步用grep过滤,若不符合正则表达式条件,则出来的file字符串可能为空。这里仅处理不为空的情况(符合条件的情况)。
4、对的。ls -l 出来的每行信息的第5个字段就是文件大小。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上的这句 for info in * 会把用户目录下的子目录内的文件也找出来
下面我写的
#!/bin/bash
for filename in `ls -l $HOME |grep ^- |awk '{if($5<5120){print $NF}}'`
do
filelist="$filelist $filename"
done
tar cvfz usr.tar.gz $filelist
或者下面更简单的一条语句搞定:
ls -l $HOME |grep ^- |awk '{if($5<5120){print $NF}}' |xargs -i tar cvfz usr.tar.gz {}
下面我写的
#!/bin/bash
for filename in `ls -l $HOME |grep ^- |awk '{if($5<5120){print $NF}}'`
do
filelist="$filelist $filename"
done
tar cvfz usr.tar.gz $filelist
或者下面更简单的一条语句搞定:
ls -l $HOME |grep ^- |awk '{if($5<5120){print $NF}}' |xargs -i tar cvfz usr.tar.gz {}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询