Linux使用shell擴展匹配文件名的方法詳解
一、命令行擴展
當(dāng)在Bashshell提示符中鍵入命令時,shell在運行該命令行之前可以通過多個擴展對其進行處理。也可以使用這些shell擴展來執(zhí)行原本很難或不可能完成的復(fù)雜任務(wù)。
Bash執(zhí)行的主要擴展有:
大括號擴展,可以生成多個字符串
波形符擴展,擴展至用戶主目錄路徑
變量擴展,將文本替換為shell變量中存儲的值
命令替換,將文本替換為命令的輸出
路徑名擴展,幫助按模式匹配選擇一個或多個文件
路徑名擴展以前稱為通配,是Bash最有用的功能之一。使用此功能,可以更加輕松地管理多個文件。使用“擴展”的元字符來匹配要尋找的文件名和路徑名,可以一次性針對集中的一組文件執(zhí)行命令。
1.1.路徑名擴展和模式匹配
路徑名擴展將表示通配符或字符類別的特殊字符模式擴展為與該模式匹配的文件名列表。在shell運行您的命令之前,它會將模式替換為匹配的文件名列表。如果該模式與任何內(nèi)容都不匹配,則shell將嘗試使用該模式作為其運行的命令的字面參數(shù)。下表列出了用于模式匹配的常見元字符和模式類。
元字符和匹配項表
| 模式 | 匹配項 |
| * | 由零個或更多字符組成的任何字符串 |
| ? | 任何一個字符 |
| [abc...] | 括起的類(位于兩個方括號之間)中的任何一個字符 |
| [!abc...] | 不在括起的類中的任何一個字符 |
| [^abc...] | 不在括起的類中的任何一個字符 |
| [[:aIpha:]] | 任何字母字符 |
| [[:lower:]] | 任何小寫字符 |
| [[:upper:]] | 任何大小字符 |
| [[:aInum:]] | 任何字母字符或數(shù)字 |
| [[:punct:]] | 除空格和字母數(shù)字以外的任何可打印字符 |
| [[:digit:]] | 從0到9的任何單個數(shù)字 |
| [[:space:]] | 任何單個空格字符,可能包括制表符、換行符、回車符、換行符或空格 |
使用示例:
創(chuàng)建一些示例
mkdir glob; cd glob touch alpha bravo charlie delta echo able baker cast dog easy

示例1:使用*進行簡單模式匹配,分別匹配以“a”開頭的所有文件名和所有含“a”的所有文件名。
所有以a開頭的文件名
所有含“a”的所有文件名
匹配以“a”或“c”開頭的所有文件名

示例2:使用問號(?)字符來匹配其中的一些文件名。這兩個字符分別僅匹配四個和五個字符的文件名

1.2.大括號擴展
大括號擴展用于生成任意字符串。大括號包含字符串的逗號分隔列表或順序表達式。結(jié)果包含大括號定義之前或之后的文本。大括號擴展可以互相嵌套。也可以使用雙點語法(..),將它擴展為一個序列。例如,大括號內(nèi)的{m..p}雙點語法擴展為mnop。
注意:最常用的場景就是批量創(chuàng)建目錄或則文件

1.3.波形符擴展
波形符(~)可匹配當(dāng)前用戶的主目錄。如果開頭為斜杠(\)以外的字符串,shell就會將該斜杠之前的字符串解譯為用戶名;如果存在匹配項,則用該用戶的主目錄絕對路徑來替換此字符串。如果找不到匹配的用戶名,shell將使用實際波形符加上該字符串。
在以下示例中,echo命令用于顯示波形符字符的值。也可使用echo命令顯示大括號和變量擴展字符等的值。

1.4.變量擴展
變量的作用類似于可以在內(nèi)存中存儲值的命名容器。通過變量,可以從命令行或在shell腳本內(nèi)輕松訪問和修改存儲的數(shù)據(jù)。
您可以通過以下語法將數(shù)據(jù)作為值分配給變量:
[user@host -]$ VARIABLENAME=value
可以使用變量擴展將變量名稱轉(zhuǎn)換為命令行上的值。如果字符串以美元符號($)開頭,那么shell就會嘗試將該字符串的其余部分用作變量名稱,并將它替換為變量中包含的任何值。

要預(yù)防因其他shell擴展而引起的錯誤,您可以將變量的名稱放在大括號中,${VARIABLENAME}

注意:變量名稱只能包含字母(大寫和小寫)、數(shù)字和下劃線。變量名稱區(qū)分大小寫,不能以數(shù)字開頭。
1.5.命令替換
命令替換允許命令的輸出替換命令行上的命令本身。當(dāng)命令括在括號中并且前面有美元符號($)時,會發(fā)生命令替換。$(command)形式可以互相嵌套多個命令擴展。

1.6.防止參數(shù)被擴展
在Bashshell中,許多字符有特殊含義。為防止命令行的某些部分上執(zhí)行shell擴展,您可以為字符和字符串加引號(`)或執(zhí)行轉(zhuǎn)義(\)。
反斜杠(\)是Bashshell中的轉(zhuǎn)義字符。它可以防止其后的字符被擴展。
例如:

在上面的示例中,保護美元符號免于擴展,Bash將其視為常規(guī)字符,因此也就未在$HOME上執(zhí)行變量擴展。
如果要保護較長的字符串,則使用單引號(‘)或雙引號(")來括起字符串。它們的作用略有不同。單引號將阻止所有shell擴展。雙引號則阻止大部分shell擴展。
雙引號可抑制美元符號($)、反斜杠(\)、反引號(`)和感嘆號(!)以外的特殊字符在引用文本內(nèi)發(fā)揮作用。這會阻止路徑名擴展,但仍允許進行命令替換和變量擴展。

使用單引號則可以按字面解譯引號之間的所有文本。

二、綜合示例
1.使用ssh命令,以student用戶身份登錄serverb計算機。系統(tǒng)的配置支持使用SSH密鑰來進行身份驗證。

2.在Documents目錄中創(chuàng)建一個名為project_plans的目錄。Documents目錄應(yīng)該放到student用戶的主目錄中。在project_plans目錄中創(chuàng)建兩個空文件,取名為season1_project_plan.odf 和 season2_project_plan.odf.
提示: 如 ~/Documents目錄不存在,請使用mkdir命令-p選項創(chuàng)建該目錄。
mkdir -p ~/Documents
cd Documents
mkdir project_plans
touch season{1,2}_project_plan.odf或
mkdir -p ~/Documents/project_plans
touch ~/Documents/project_plans/{season1,season2}_project_plan.odf
ls -lR Documents/
3.創(chuàng)建本實驗要使用的一組空白練習(xí)文件。使用shell的Tab補全功能可以輕松查找文件路徑名。在/home/student 目錄中創(chuàng)建名為tv_seasonX_episodeY.ogg的12個文件。將X替換為季數(shù),Y替換為該季中的集數(shù),共兩季,每季六集。
touch tv_season{1,2}_episode{1..6}.ogg
ls tv*
4.作為一名成功的連載懸疑小說作者,您正在為出版下一部暢銷書編輯章節(jié)。創(chuàng)建八個名為mystery_chapterX.odf的文件。將X替換為數(shù)字1到8。
touch mystery_chapter{1..8}.odf
ls mys*
5.使用一個命令在Videos目錄下創(chuàng)建兩個子目錄,名稱為season1和season2,以整理電視劇集。將適當(dāng)?shù)碾娨晞〖频诫娨暭咀幽夸浿小H使用兩個命令,通過相對語法指定目的地。
5.1.利用一個命令,直接在Videos目錄下創(chuàng)建名為season1,season2的子目錄

5.2.僅使用兩個命令,將適當(dāng)?shù)碾娨晞〖频诫娨暭咀幽夸浿?/p>
mv tv_season1* Videos/season1 mv tv_season2* Videos/season2 ls -R Videos

6.利用單個命令創(chuàng)建一個兩級目錄層次結(jié)構(gòu),以整理懸疑小說章節(jié)。在Documents目錄下創(chuàng)建my_bestseller 子目錄,并在新的my_bestseller 目錄下創(chuàng)建chapters子目錄。利用一個命令,直接在my_bestseller目錄下再創(chuàng)建3個子目錄。將這些子目錄命名為editor、changes和vacation。您不需要使用mkdir-p命令來創(chuàng)建父目錄,因為已存在my_bestseller 父目錄。
6.1.在Documents目錄下創(chuàng)建my_bestseller目錄。在my_bestseller目錄下創(chuàng)建chapters目錄。
mkdir -p Documents/my_bestseller/chapters ls -R Documents

6.2.利用一個命令,直接在my_bestseller目錄下創(chuàng)建名為editor、changes和vacation的子目錄
mkdir Documents/my_bestseller/{editor,changes,vacation}
ls -R Documents
7.切換為chapters目錄。使用波形符(~)主目錄快捷鍵,將所有圖書章節(jié)移到chapters目錄中,即您現(xiàn)在的當(dāng)前目錄。使用最簡單的語法來指定目標(biāo)目錄。您想要將前兩個章節(jié)將發(fā)送給編輯進行審閱。僅將這兩個章節(jié)移到editor目錄,以避免在審閱期間修改它們。從chapters子目錄開始,使用帶有范圍的大括號擴展來指定要移動的章節(jié)文件名和目標(biāo)目錄的相對路徑。
7.1.更改到chapters目錄,再使用波形符(~)主目錄快捷鍵,將所有的圖書章節(jié)移到chapters目錄中。
cd Documents/my_bestseller/chapters mv ~/mystery_chapter* . ls

7.2.將前兩章移至editor目錄,使用帶有范圍的大括號擴展來指定要移動的章節(jié)文件名和目標(biāo)目錄的相對路徑。
mv mystery_chapter{1..2}.odf ../editor
ls
ls ../editor
7.3.使用單個命令,將第7章和第8章從chapters目錄移到vacation目錄。使用帶有字符串列表的大括號擴展指定章節(jié)文件名,而不使用通配符字符。
mv mystery_chapter{7,8}.odf ../vacation
ls
ls ../vacation
8.將您的工作目錄更改為~/Videos/season2,然后將本季的第一集復(fù)制到 vacation目錄。使用一個cd命令,從工作目錄更改為~/Documents/my_bestseller/vacation目錄。列出其文件。使用上一工作目錄參數(shù),返回到season2目錄。(如果最近一次用cd命令更改目錄是通過一個命令而非多個cd命令來實現(xiàn)的,此參數(shù)會成功。)從season2目錄,將第2集文件復(fù)制到vacation目錄。再次使用快捷鍵返回到vacation目錄。
8.1.將您的工作目錄更改為~/Videos/season2,然后將本季的第一集復(fù)制到vacation目錄。
cd ~/Videos/season2 cp *episode1.ogg ~Documents/my_bestseller/vacation

8.2.使用一個cd命令從你的工作目錄更改為~/Documents/my_bestseller/vacation目錄,列出其文件,然后使用 - 參數(shù)返回到上一目錄。將第2集文件復(fù)制到vacation目錄。使用帶有 - 參數(shù)的cd命令返回到vacation目錄。
cd ~/Documents/my_bestseller/vacation ls cd - cp *episode2.ogg ~/Documents/my_bestseller/vacation cd -

9.第5章和第6章的作者想要試驗可能的修訂。將這兩個文件從~/Documents/my_bestseller/chapters 目錄復(fù)制到]~/Documents/my_bestseller/changes 目錄,以防止這些修訂會修改原始文件。前往~/Documents/my_bestseller目錄。使用方括號模式匹配來指定要在cp命令的文件名參數(shù)中匹配的章節(jié)號。
cd ~/Documents/my_bestseller cp chapters/mystery_chapter[56].odf changes ls chapters ls changes

10.將您的當(dāng)前目錄更改為changes目錄,通過命令替換使用date +%F命令將mystery_chapter5.odf復(fù)制到包含完整日期的新文件。使用mystery_chapter5_YYYY-MM-DD.odf名稱格式。通過date +%s命令來進行替換,制作mystery_chapter5.odf 的另一個副本,并且附上當(dāng)前的時間戳(即自時期1970-01-0100:00UTC起的秒數(shù)),確保文件名獨一無二。
cd changes cp mystery_chapter5.odf mystery_chapter5_$(date +%F).odf cp mystery_chapter5.odf mystery_chapter5_$(date +%s).odf ls

11.進一步審閱后,您決定不需要修訂情節(jié)。刪除changes目錄。
如有必要,前往changes目錄并刪除該目錄中的所有文件。如果是當(dāng)前工作目錄,您無法刪涂該目錄。
更改到changes目錄的父目錄。嘗試使用rm命令(不帶-r遞歸選項)來刪除空目錄。此嘗試應(yīng)該會失敗。最后,使用rmdir命令刪除空目錄,而這會成功。度假結(jié)束后,您不再需要vacation目錄。通過使用rm命令(帶遞歸選項)刪除該目錄。完成時,返回到student用戶的主目錄。
11.1.刪除changes目錄。更改changes目錄的父目錄,再嘗試使用不帶-r遞歸選項的rm命令來刪除空目錄。
rm mystery* cd .. rm changes rmdir changes ls

11.2.使用帶有-r選項的rm命令來刪除vacation目錄。返回到student用戶的主目錄。
rm -r vacation ls cd

12. 創(chuàng)建~/Documents/project_plans/season2_project_plan.odf 文件的硬鏈接,取名為-/Documents/backups/season2_project_plan.odf.back,硬鏈接可防意外刪除原始文件,并在您更改原始文件時使備份文件保持更新。提示:如果~/Documents/backups目錄不存在,請使用mkdir命令創(chuàng)建該目錄。
12.1.創(chuàng)建~/Documents/project_plans/season2_project_plan.odf 文件的硬鏈接,取名為-/Documents/backups/season2_project_plan.odf.back
mkdir -p ~/Documents/backups ln ~/Documents/project_plans/season2_project_plan.odf \ ~/Documents/backups/season2_project_plan.odf.back ls -lR ~/Documents/

以上就是Linux使用shell擴展匹配文件名的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Linux shell擴展匹配文件名的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Linux Shell+Curl網(wǎng)站健康狀態(tài)檢查腳本,抓出中國博客聯(lián)盟失聯(lián)站點
這篇文章主要介紹了Shell+Curl網(wǎng)站健康狀態(tài)檢查腳本,抓出中國博客聯(lián)盟失聯(lián)站點,需要的朋友可以參考下2016-02-02
讓Linux下的cron以秒為單位執(zhí)行shell腳本的3種方法
這篇文章主要介紹了讓Linux下的cron以秒為單位執(zhí)行shell腳本的3種方法,cron默認(rèn)只支持以分為單位執(zhí)行Shell腳本的,需要的朋友可以參考下2014-10-10
Bash的For循環(huán)(根據(jù)每次遞增的數(shù))
需要執(zhí)行一個命令,每次消除500個id,通常寫的是遞增1的,記一筆,怕忘了2013-08-08
在Linux中自動化腳本執(zhí)行重復(fù)性任務(wù)的詳細(xì)步驟
選擇適合你需求的腳本語言,對于大多數(shù)自動化任務(wù),Bash腳本是一個不錯的選擇,因為它易于編寫和理解,對于更復(fù)雜的任務(wù),你可能需要使用Python或其他編程語言,下面給大家分享在Linux中編寫自動化腳本執(zhí)行重復(fù)性任務(wù)通常涉及的步驟,感興趣的朋友跟隨小編一起看看吧2024-05-05

