Shell腳本實現文件遍歷和刪除操作

来源:http://www.cnblogs.com/shuimuzhushui/archive/2017/11/11/7819268.html
-Advertisement-
Play Games

本文需要實現的功能如下:某文件夾下具有由按數字編號命名的文件夾,需要刪除除最大編碼外的文件。 具體實現 大致思路:迴圈遍歷該文件夾下所有文件,正則匹配出最大編碼文件;然後迴圈文件,刪除除最大編碼外的文件。 實現代碼如下: 實現效果:文件夾:/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命令時的致命誤區的講述

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DBLINK資料庫鏈接是一個資料庫中的模式對象,使您可以訪問另一個資料庫上的對象。 dblink限定符允許您引用除本地資料庫以外的資料庫中的對象,如果省略了dblink,那麼Oracle假定您指的是本地資料庫中的一個對象,並非所有的SQL語句都允許您訪問遠程資料庫上的對象。 新增: 方法一:藉助配置 ...
  • 1、找到redis.conf,配置密碼 2、要重新啟動一下redis 3、用redis-cli重新登陸,我們查詢的時候提示“Authentication required”查詢失敗 4、重新帶密碼登陸,發現可以查詢了 參考: [1]博客,http://blog.csdn.net/zyz5119197 ...
  • 概述 MongoDB是目前非常流行的一種非關係型資料庫,作為入門系列的第一篇本篇文章主要介紹Mongdb的基礎概念知識包括命名規則、數據類型、功能以及安裝等。 環境: OS:Windows Version:3.4 一、安裝 1.下載解壓 在官網下載對應操作系統版本的安裝包,然後解壓;我這裡使用Win ...
  • 一、UDEV是什麼? Udev是一個針對Linux內核2.6的可提供自動創建的設備節點和命名的解決方法的一個文件系統;其實與/etc/目錄下的fstab文件類似 二、Udev如何獲取內核這些模塊的變化信息? 參考博客:http://blog.chinaunix.net/uid-24943863-id ...
  • 一、Nginx是什麼 Nginx (engine x) 是一個 高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器 。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。 ...
  • 第1章 Oracle Database 12c Release 2安裝詳解 1.1 下載方法 oracle官網https://www.oracle.com 1)打開官方網站,找到下載連接 2)選擇更多下載。 3)選擇資料庫版本,這裡選擇的是目前的最新版本 4)接收許可協議,選在linux版本進行下載 ...
  • lamp環境已搭建完成基礎之上 上傳owncloud-10.0.3.zip到Linux 解壓owncloud-10.0.3.zip [root@localhost ~]#unzip owncloud-10.0.3.zip 複製解壓後的文件到/var/www/html [root@localhost ...
  • 要想從現在的低薪(年薪10萬以下)快讀變成未來的高新(年薪30萬以上)我們要做的就只有從自身改變開始! 人改變自己的勇氣,朱啊喲取決於我們自己當前的痛苦程度!直到某一天真的迴避不了了,才會被動的改變,被動改變結果往往是來不及的,或者花的代價相當高,獲得的回報又比較低!改變自己越早越好!成功的人一般都 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...