用Shell批量删除AndroidStudio build目录

多数Android程序猿都有一个痛,使用AndroidStudio开发安卓项目时,build目录占用太多存储空间。在没有版本控制工具的情况下,一些没有经验的Android开发者会将自己的程序直接打包发送给别人。这样的代码包,少则几十兆,多则数百兆,其中多数都是build目录下的文件。(使用eclipse开发时,bin 目录和gen目录与之类似。

在AS工程中,至少有一个项目级的build目录,每个module 都有一个自己的build目录。也许你们觉得发送代码之前,仔细删除几个build目录,很简便的申请,没必要去为此大费周章的去写什么脚本工具。但是楼主由于工作性质,经常会有同事发送代码过来、和发送代码给同事的情况,以及电脑里存储了公司几十个项目的源码,偶尔改下bug,编译一次。这样才有了写脚本的念头。

下图是删除build前后的对比,节省了24G的存储空间。

1 Shell 脚本

1.1 遍历目录

遍历文件和文件夹,是一个递归的过程,因此声明一个函数readDir递归调用。使用命令ls 路径 遍历路径下全部文件(夹),使用for循环获取到全部输出,判断是文件夹,先输出文件夹路径再进行递归,判断是文件,直接进行输出。

1.1.1 脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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

此处有两个变量 $1for循环中的 $1readDir函数接收的第一个参数。readDir $1表示在终端执行脚本文件时,接收的第一个参数。其中$0表示脚本文件的路径。

1
2
3
echo $0
echo $1
echo $2

上述代码输出:

del-build 参数1 参数2
/Volumes/flueky/shell/del-build
参数1
参数2

1.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 文件名 添加文件的执行权限。

1.2 删除build目录

弄清楚遍历的脚本后,可以在此基础上删除指定文件(夹)。由于build是文件夹,因此只需要在if [ -d $dir_or_file ]中,添加删除操作。

1.2.1 脚本内容

1
2
3
4
5
6
7
8
9
10
11
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,再进行删除和遍历操作。

1.2.2 脚本测试

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

2 总结

完整脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/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 脚本时,动态指定需要删除的文件夹。

觉得有用?那打赏一个呗。[去打赏](/donate/)

Author: flueky
Link: http://example.com/236/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.