使用Shell批量刪除AndroidStudio build目錄

前言

多數Android程序猿都有一個痛,使用AndroidStudio開發安卓項目時,build目錄佔用太多存儲空間。在沒有版本控制工具的狀況下,一些沒有經驗的Android開發者會將本身的程序直接打包發送給別人。這樣的代碼包,少則幾十兆,多則數百兆,其中多數都是build目錄下的文件。(使用eclipse開發時,bin 目錄和gen目錄與之相似。shell

在AS工程中,至少有一個項目級的build目錄,每一個module 都有一個本身的build目錄。也許大家以爲發送代碼以前,仔細刪除幾個build目錄,很簡便的申請,不必去爲此大費周章的去寫什麼腳本工具。可是樓主因爲工做性質,常常會有同事發送代碼過來、和發送代碼給同事的狀況,以及電腦裏存儲了公司幾十個項目的源碼,偶爾改下bug,編譯一次。這樣纔有了寫腳本的念頭。bash

下圖是刪除build先後的對比,節省了24G的存儲空間。eclipse

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目錄外執行此腳本文件。ui

新建腳本文件後,須要使用命令 chmod a+x 文件名 添加文件的執行權限。spa

刪除build目錄

弄清楚遍歷的腳本後,能夠在此基礎上刪除指定文件(夾)。因爲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 腳本時,動態指定須要刪除的文件夾。

相關文章
相關標籤/搜索