使用Shell批量删除AndroidStudio build目录

Java基础

浏览数:84

2020-6-16

前言

多数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

此处有两个变量 $1for循环中的 $1readDir函数接收的第一个参数。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 脚本时,动态指定需要删除的文件夹。

作者:flueky