多数Android程序猿都有一个痛,使用AndroidStudio开发安卓项目时,build目录占用太多存储空间。在没有版本控制工具的状况下,一些没有经验的Android开发者会将本身的程序直接打包发送给别人。这样的代码包,少则几十兆,多则数百兆,其中多数都是build目录下的文件。(使用eclipse开发时,bin 目录和gen目录与之相似。)shell
在AS工程中,至少有一个项目级的build目录,每一个module 都有一个本身的build目录。也许大家以为发送代码以前,仔细删除几个build目录,很简便的申请,不必去为此大费周章的去写什么脚本工具。可是楼主因为工做性质,常常会有同事发送代码过来、和发送代码给同事的状况,以及电脑里存储了公司几十个项目的源码,偶尔改下bug,编译一次。这样才有了写脚本的念头。bash
下图是删除build先后的对比,节省了24G的存储空间。eclipse
遍历文件和文件夹,是一个递归的过程,所以声明一个函数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目录外执行此脚本文件。ui
新建脚本文件后,须要使用命令 chmod a+x 文件名
添加文件的执行权限。spa
弄清楚遍历的脚本后,能够在此基础上删除指定文件(夹)。因为build
是文件夹,所以只须要在if [ -d $dir_or_file ]
中,添加删除操做。3d
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 脚本时,动态指定须要删除的文件夹。