编写一个shell脚本,自动将用户目录下所有小于5k的文件打包成tar.gz(提示需要配合ls和grep命令。)

 我来答
百度网友5311d79
推荐于2016-10-14 · TA获得超过1.9万个赞
知道大有可为答主
回答量:6356
采纳率:71%
帮助的人:3220万
展开全部
#!/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

脚本不考虑子目录内容。
追问
你好,不知你有没有执行过,我执行的环境为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个字段就是文件大小。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友dbf034ff489
2012-08-11
知道答主
回答量:15
采纳率:0%
帮助的人:10.3万
展开全部
楼上的这句 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 {}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式