linux下擷取給定路徑中的目錄部分

散盡浮華發表於2016-12-15

 

在日常運維中,有時會要求擷取一個路徑中的目錄部分。
擷取目錄的方法,有以下兩種:
1)dirname命令(最常用的方法):用於取給定路徑的目錄部分。很少直接在shell命令列中使用,一般把它用在shell指令碼中,用於取得指令碼檔案所在目錄,然後將當前目錄切換過去。
其實就是取所給路徑的倒數第二級及其之前的路徑部分,如下:
[root@jenkins-server Shell]# dirname main/protected/xqsjmob/themes/tpl2/common/page_statistics.tpl
main/protected/xqsjmob/themes/tpl2/common
[root@jenkins-server Shell]# dirname /usr/local/tomcat7/webapps/jenkins/scripts/Shell
/usr/local/tomcat7/webapps/jenkins/scripts
[root@qzt196 ~]# dirname /usr/bin/sort
/usr/bin
[root@qzt196 ~]# dirname stdio.h //獲取的是當前目錄路徑
.
[root@qzt196 ~]# dirname /usr/bin
/usr
[root@qzt196 ~]# dirname /usr/bin/
/usr

2)可以用${pathname%/*}擷取掉pathname後面的檔案部分。
下面比較下這兩種方法的效果:即dirname取的是倒數第二級及其以上級的路徑,而${pathname%/*}取的是"刪除最後一個/符號後的路徑部分"
[root@jenkins-server Shell]# pathname=/usr/bin/sort; echo $(dirname $pathname) ${pathname%/*}
/usr/bin /usr/bin
You have new mail in /var/spool/mail/root
[root@jenkins-server Shell]# pathname=/usr/bin/sort/; echo $(dirname $pathname) ${pathname%/*}
/usr/bin /usr/bin/sort
[root@jenkins-server Shell]# pathname=/usr/; echo $(dirname $pathname) ${pathname%/*}
/ /usr
[root@jenkins-server Shell]# pathname=/usr; echo $(dirname $pathname) ${pathname%/*}
/

除了使用dirname外,sed也可以實現這種功能
例項如下:
[root@master-node ~]# cat a.txt
/home/wang/test.txt
/web/www/test.js
/data/mongodb/smsb/smsb.txt
/tmp/abc/mysql.sock
[root@master-node ~]# sed -n 's:/[^/]*$::p' a.txt
/home/wang
/web/www
/data/mongodb/smsb
/tmp/abc
[root@master-node ~]# for i in `cat /root/a.txt`;do dirname $i;done
/home/wang
/web/www
/data/mongodb/smsb
/tmp/abc

相關文章