多數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 腳本時,動態指定須要刪除的文件夾。