本文需要實現的功能如下:某文件夾下具有由按數字編號命名的文件夾,需要刪除除最大編碼外的文件。 具體實現 大致思路:迴圈遍歷該文件夾下所有文件,正則匹配出最大編碼文件;然後迴圈文件,刪除除最大編碼外的文件。 實現代碼如下: 實現效果:文件夾:/root/cloud/builds 執行腳本後: 用到的S ...
本文需要實現的功能如下:某文件夾下具有由按數字編號命名的文件夾,需要刪除除最大編碼外的文件。
具體實現
大致思路:迴圈遍歷該文件夾下所有文件,正則匹配出最大編碼文件;然後迴圈文件,刪除除最大編碼外的文件。
實現代碼如下:
#!/bin/bash function getdir(){ max=0 DATEPATTERN="^[0-9]*$" for element in `ls $1` do if [[ "$element" =~ $DATEPATTERN ]] then if [ `expr $max - $element` -lt 0 ] then max=$element fi fi done for element in `ls $1` do if [[ "$element" =~ $DATEPATTERN ]] then if [ $max != $element ] then rm -rf element fi fi done } root_dir="/root/cloud/builds" getdir $root_dir
實現效果:文件夾:/root/cloud/builds
執行腳本後:
用到的Shell基本知識
1. 變數
shell腳本的變數聲明通過“=”進行賦值,與C++或java不同,變數名、值與等號不能有空格,否則無法識別該變數。如
var=10 var1="qwert" var2='qwert'
echo $var #輸出 10
echo $var1 #輸出 qwert
echo $var2 #輸出 qwert
獲取變數中的值,採用“$變數名”格式。
2. 字元串
聲明字元串可以採用雙引號或單引號,但兩者有一些區別
單引號:1. 單引號中的字元會原樣輸出,其中的變數不起作用; 2. 單引號中不能使用轉義字元,會報錯;
雙引號:1. 可以包含變數並取值;2. 可以包含轉義字元
#!/bin/bash a=10 val='hello world $a' echo "單引號:"$val val='hello 'world' $a' echo "單引號+單引號 = 拼接:"$val #val='hello \'world\' $a' #echo $val #報錯:/usercode/file.sh: line 9: unexpected EOF while looking for matching `'' val="hello 'world' $a" echo "雙引號+單引號 = 輸出單引號:"$val val="hello "world" $a" echo "雙引號+雙引號 = 拼接:"$val val="hello \"world\" $a" echo "雙引號+雙引號轉義字元 = 輸出雙引號:"$val val="hello "$a"world" echo "雙引號+變數 = 拼接:"$val
輸出結果:
單引號:hello world $a 單引號+單引號 = 拼接:hello world $a 雙引號+單引號 = 輸出單引號:hello 'world' 10 雙引號+雙引號 = 拼接:hello world 10 雙引號+雙引號轉義字元 = 輸出雙引號:hello "world" 10 雙引號+變數 = 拼接:hello 10world
字元串拼接問題
(1)字元串拼接賦值給變數:雙引號或者單引號拼接的時候,如果子字元串完全為純字元串,之間可以有空格;如果存在變數,則變數與字元串之間不可以有空格;
(2)字元串拼接echo輸出:可以有空格。如echo "hello" $a 'world' 輸出:hello 10 world
3. 傳遞參數
腳本函數獲取參數的格式為:$n,n表示第n個參數,如$1表示獲取第一個參數,$2表示獲取第二個參數。。。。$0表示獲取執行腳本名
4. 基本運算
原生的bash不能進行簡單的數學計算,可以通過命令實現,如awk或expr。
各種運算規則可參考菜鳥教程:http://www.runoob.com/linux/linux-shell-basic-operators.html
本文中運用到的計算包括:減法計算、不等判斷、小於判斷,如[ `expr $max - $element` -lt 0 ]、[ $max != $element ]
5. 流程式控制制
(1)條件判斷:
if condition then ...... elif then ...... else ...... fi
(2)for迴圈
for var in item1 item2 ... itemN do command1 command2 ... commandN done
具體參考:http://www.runoob.com/linux/linux-shell-process-control.html
6. 正則表達式
本文中使用的正則表達式為正整數,如"^[0-9]*$",以^開始、$結束,[0-9]標識0到9之間的任意數字,*代表由前邊字元0個或以上個字元組成。具體,可參考http://www.jb51.net/article/94354.htm或相關書籍。
判斷目標是否匹配正則表達式,採用雙方括弧和 =~,如 [[ "$element" =~ $DATEPATTERN ]]
7. #!/bin/bash
#!為約定標記,告訴系統該腳本需要什麼解釋器來執行,Linux下預設使用bash,可在 /bin目錄下查看到bash文件,如下圖:
所有需要執行的shell腳本,都需要將其寫在第一行。
總結
- 需要花點時間學習下shell的基本語法和命令,可看菜鳥教程,也可看《Shell編程從入門到精通》
- 在shell腳本中使用rm命令的時候,也需要小心,操作不慎可能導致系統掛掉,可看bash腳本中使用rm命令時的致命誤區的講述