Linux shell 之 提取文件名和目錄名的一些方法總結(jié)
很多時(shí)候在使用Linux的shell時(shí),我們都需要對(duì)文件名或目錄名進(jìn)行處理,通常的操作是由路徑中提取出文件名,從路徑中提取出目錄名,提取文件后綴名等等。例如,從路徑/dir1/dir2/file.txt中提取也文件名file.txt,提取出目錄/dir1/dir2,提取出文件后綴txt等。
下面介紹兩種常用的方法來(lái)進(jìn)行相關(guān)的操作。
一、使用${}
1、${var##*/}
該命令的作用是去掉變量var從左邊算起的最后一個(gè)'/'字符及其左邊的內(nèi)容,返回從左邊算起的最后一個(gè)'/'(不含該字符)的右邊的內(nèi)容。使用例子及結(jié)果如下:
從運(yùn)行結(jié)果可以看到,使用該命令,可以提取出我們需要的文件名file.txt。
若使用時(shí)在shell程序文件中,可以使用變量來(lái)保存這個(gè)結(jié)果,再加以利用,如file=${var##*/}
2、${var##*.}
該命令的作用是去掉變量var從左邊算起的最后一個(gè)'.'字符及其左邊的內(nèi)容,返回從左邊算起的最后一個(gè)'.'(不含該字符)的右邊的內(nèi)容。使用例子及結(jié)果如下:
從運(yùn)行結(jié)果可以看到,使用該命令,可以提取出我們需要的文件后綴。
如果文件的后綴不僅有一個(gè),例如,file.tar.gz,命令${var##*.}僅能提取最后一個(gè)后綴,而我想提取tar.gz時(shí)該怎么辦?那么就要用下面所說(shuō)的${var#*.}命令了。
3、${var#*.}
該命令的作用是去掉變量var從左邊算起的第一個(gè)'.'字符及其左邊的內(nèi)容,返回從左邊算起第一個(gè)'.'(不含該字符)的右邊部分的內(nèi)容。使用例子及結(jié)果如下:
從運(yùn)行結(jié)果可以看到,使用該命令,可以提取出文件的多個(gè)后綴。
4、${var%/*}
該命令的使用是去掉變量var從右邊算起的第一個(gè)'/'字符及其右邊的內(nèi)容,返回從右邊算起的第一個(gè)'/'(不含該字符)的左邊的內(nèi)容。使用例子及結(jié)果如下:
從運(yùn)行的結(jié)果可以看到,使用該命令,可以提取出我們需要的文件所在的目錄
5、${var%%.*}
該命令的使用是去掉變量var從右邊算起的最后一個(gè)'.'字符及其右邊的內(nèi)容,返回從右邊算起的最后一個(gè)'.'(不含該字符)的左邊的內(nèi)容。使用例子及結(jié)果如下:
當(dāng)我們需要建立一個(gè)與文件名相同名字(沒(méi)有后綴)的目錄與對(duì)應(yīng)的文件相對(duì)應(yīng)時(shí),就可以使用該命令來(lái)進(jìn)行操作。例如,解壓文件的情況就與此類(lèi)似,我們壓縮文件file.zip時(shí),會(huì)在與file.zip同級(jí)目錄下建立一個(gè)名為file的目錄。
6、${}總結(jié)
其實(shí)${}并不是專(zhuān)門(mén)為提取文件名或目錄名的,它的使用是變量的提取和替換等等操作,它可以提取非常多的內(nèi)容,并不一定是上面五個(gè)例子中的'/'或'.'。也就是說(shuō),上面的使用方法只是它使用的一個(gè)特例。
看到上面的這些命令,可能會(huì)讓人感到非常難以理解和記憶,其實(shí)不然,它們都是有規(guī)律的。
#:表示從左邊算起第一個(gè)
%:表示從右邊算起第一個(gè)
##:表示從左邊算起最后一個(gè)
%%:表示從右邊算起最后一個(gè)
換句話(huà)來(lái)說(shuō),??偸潜硎咀筮吽闫?,%總是表示右邊算起。
*:表示要?jiǎng)h除的內(nèi)容,對(duì)于#和##的情況,它位于指定的字符(例子中的'/'和'.')的左邊,表于刪除指定字符及其左邊的內(nèi)容;對(duì)于%和%%的情況,它位于指定的字符(例子中的'/'和'.')的右邊,表示刪除指定字符及其右邊的內(nèi)容。這里的'*'的位置不能互換,即不能把*號(hào)放在#或##的右邊,反之亦然。
例如:${var%%x*}表示找出從右邊算起最后一個(gè)字符x,并刪除字符x及其右邊的字符。
看到這里,就可以知道,其實(shí)該命令的用途非常廣泛,上面只是指針文件名和目錄名的命名特性來(lái)進(jìn)行提取的一些特例而已。
二、basename和dirname
${}并不是專(zhuān)門(mén)為提取文件名和目錄名設(shè)計(jì)的命令,那么basename和dirname命令就是專(zhuān)門(mén)為做這一件事而已準(zhǔn)備的了。
1、basename
該命令的作用是從路徑中提取出文件名,使用方法為basename NAME [SUFFIX]。
1)從路徑中提出出文件名(帶后綴),例子如下:
2)從上面命令的用法中可以看到,后綴(SUFFIX)是一個(gè)可選項(xiàng)。所以,若只想提取出文件名file,而不帶有后綴,還可以在變量的后面加上后綴名,例子如下:
2、dirname
該命令的作用是從路徑中提取出目錄名,使用方法為 dirname NAME
使用例子如下:
這樣就提取出了file.txt文件所在的目錄。
注:該命令不僅能提取出普通文件所的目錄,它能提取出任何文件所在的目錄,例如目錄所在的目錄,如下:
它提取出了目錄dir2所在的目錄dir1.
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Shell腳本一鍵安裝Nginx服務(wù)自定義Nginx版本
這篇文章主要為大家介紹了Shell腳本一鍵安裝Nginx服務(wù),用戶(hù)可自定義Nginx版本的腳本示例,有需要的朋友可以借鑒參考下,希望能夠參考下2022-03-03實(shí)戰(zhàn)模擬監(jiān)控MySQL服務(wù)shell腳本小結(jié)
老男孩shell培訓(xùn)課上帶領(lǐng)學(xué)生練習(xí)shell開(kāi)發(fā)if語(yǔ)句時(shí)的幾個(gè)小例子和大家分享,需要的朋友可以參考下2016-05-05Linux?shell命令行查詢(xún)文件中內(nèi)容常用的命令及其用法
在Linux中,查找文件內(nèi)容可以使用多種命令,如grep、find、ack和ripgrep,這些工具各有特點(diǎn),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09shell腳本內(nèi)調(diào)用另外一個(gè)shell腳本的幾種方法講解
在Linux開(kāi)發(fā)中經(jīng)常會(huì)編寫(xiě)shell腳本來(lái)執(zhí)行一些任務(wù),下面這篇文章主要給大家介紹了關(guān)于shell腳本內(nèi)調(diào)用另外一個(gè)shell腳本的幾種方法,需要的朋友可以參考下2023-06-06Linux 查看端口的占用情況并找出并殺死占用進(jìn)程的方法
這篇文章主要介紹了Linux 查看端口的占用情況并找出并殺死占用進(jìn)程的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-08-08Shell腳本實(shí)現(xiàn)復(fù)制文件到多臺(tái)服務(wù)器的代碼分享
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)復(fù)制文件到多臺(tái)服務(wù)器的代碼分享,用在多機(jī)集群環(huán)境中非常方便,需要的朋友可以參考下2014-09-09