前言
多数Android程序猿都有一个痛,使用AndroidStudio开发安卓项目时,build目录占用太多存储空间。在没有版本控制工具的情况下,一些没有经验的Android开发者会将自己的程序直接打包发送给别人。这样的代码包,少则几十兆,多则数百兆,其中多数都是build目录下的文件。(使用eclipse开发时,bin 目录和gen目录与之类似。)
在AS工程中,至少有一个项目级的build目录,每个module 都有一个自己的build目录。也许你们觉得发送代码之前,仔细删除几个build目录,很简便的申请,没必要去为此大费周章的去写什么脚本工具。但是楼主由于工作性质,经常会有同事发送代码过来、和发送代码给同事的情况,以及电脑里存储了公司几十个项目的源码,偶尔改下bug,编译一次。这样才有了写脚本的念头。
下图是删除build前后的对比,节省了24G的存储空间。


shell 脚本
遍历目录
遍历文件和文件夹,是一个递归的过程,因此声明一个函数readDir
递归调用。使用命令ls 路径
遍历路径下全部文件(夹),使用for
循环获取到全部输出,判断是文件夹,先输出文件夹路径再进行递归,判断是文件,直接进行输出。
脚本内容
#!/bin/bash function readDir(){ for element in `ls $1` # 遍历 ls 输出 do dir_or_file=$1"/"$element # 拼接完整地址 if [ -d $dir_or_file ] # 判断是文件夹 then echo "$dir_or_file" # 输出文件夹路径 readDir $dir_or_file # 遍历文件夹 else echo "$dir_or_file" # 输出文件路径 fi done } readDir $1
此处有两个变量 $1
。for
循环中的 $1
指 readDir
函数接收的第一个参数。readDir $1
表示在终端执行脚本文件时,接收的第一个参数。其中$0
表示脚本文件的路径。
echo $0 echo $1 echo $2
上述代码输出:
del-build 参数1 参数2 /Volumes/flueky/shell/del-build 参数1 参数2
脚本测试
del-build /Volumes/flueky/GitHub/flueky/blog/shell删除build目录 /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/blog.md /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/build /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/build/test /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/build/test1 /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/pic /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/pic/52BAADAA2A0974465F2A4873DC306D9B.jpg /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/pic/B18656263D5D14EE02C0B47A7C707BEF.jpg /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/test /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/test/build /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/test/build/heheda /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/test/heheda
del-build 为脚本文件名,由于楼主直接将脚本所在的shell目录添加到环境变量中,因此可以直接在shell目录外执行此脚本文件。
新建脚本文件后,需要使用命令 chmod a+x 文件名
添加文件的执行权限。
删除build目录
弄清楚遍历的脚本后,可以在此基础上删除指定文件(夹)。由于build
是文件夹,因此只需要在if [ -d $dir_or_file ]
中,添加删除操作。
脚本内容
dir_or_file=$1"/"$element if [ -d $dir_or_file ] then if [ $element = "build" ] # 判断文件夹名是build then echo "$dir_or_file" # 输出文件夹路径 rm -rfv $dir_or_file # 删除文件夹 else readDir $dir_or_file # 遍历文件夹 fi fi
$element
是 ls
命令输出的文件名,需要和$1
拼接形成完整的路径。在dir_or_file
是文件夹的前提下,判断文件名是否是build
,再进行删除和遍历操作。
脚本测试
del-build /Volumes/flueky/GitHub/flueky/blog/shell删除build目录 /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/build /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/build/test /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/build/test1 /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/build /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/test/build /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/test/build/heheda /Volumes/flueky/GitHub/flueky/blog/shell删除build目录/test/build
总结
完整脚本内容如下:
#!/bin/bash function readDir(){ for element in `ls $1` do dir_or_file=$1"/"$element if [ -d $dir_or_file ] then if [ $element = "build" ] then echo "$dir_or_file" rm -rfv $dir_or_file else readDir $dir_or_file fi fi done } readDir $1
至此一个简单的批操作脚本已经完成。可以将"build"
替换成$2
,在执行 del-build 脚本时,动态指定需要删除的文件夹。