在平常運維中,有時會要求截取一個路徑中的目錄部分。
截取目錄的方法,有如下兩種:
1)dirname命令(最經常使用的方法):用於取給定路徑的目錄部分。不多直接在shell命令行中使用,通常把它用在shell腳本中,用於取得腳本文件所在目錄,而後將當前目錄切換過去。
其實就是取所給路徑的倒數第二級及其以前的路徑部分,以下:html
[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
*************************************************************************
還有一個"basename"命令,用於截取一個path中最後一個node
[root@jenkins-server Shell]# dirname /usr/local/src/ /usr/local [root@jenkins-server Shell]# basename /usr/local/src/ src
2)能夠用${pathname%/*}截取掉pathname後面的文件部分。能夠參考: http://www.javashuo.com/article/p-xlwxogfy-bk.html
下面比較下這兩種方法的效果:即dirname取的是倒數第二級及其以上級的路徑,而${pathname%/*}取的是"刪除最後一個/符號後的路徑部分"mysql
[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也能夠實現這種功能,實例以下:web
[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