Linux中basename和dirname命令的妙用
有同學問,如何/dir1/dir2/dir3/file中的,前半部分:/dir1/dir2/dir3和最後部分file,這個用字串分隔及${str//}來處理還比較難辦,這個時候basename和dirname命令就很方便了。
[dirname]
手冊頁“Print NAME with its trailing /component removed; if NAME contains no /’s, output ‘.’ (meaning the current directory).”該命令可以取給定路徑的目錄部分(strip non-directory suffix from file name)。這個命令很少直接在shell命令列中使用,我們一般把它用在shell指令碼中,用於取得指令碼檔案所在目錄,然後將當前目錄切換過去。
★常用示例
示例一: # /usr/bin為獲取到的目錄
[root@local ~]# dirname /usr/bin/sort
/usr/bin
示例二: # 如無/則獲取當前目錄.
[root@local ~]# dirname stdio.h
.
示例三: # 含/和無/,其結果和不含/效果一樣的
[root@local ~]# dirname /usr/bin
/usr
[root@local ~]# dirname /usr/bin/
/usr
示例四: # 獲取多個目錄列表,以換行為分隔
[root@local ~]# dirname dir1/file1 dir2/file2
dir1
dir2
示例五: # 獲取多個目錄列表,以NUL為分隔
[root@local ~]# dirname -z dir1/file1 dir2/file2
dir1dir2
★指令碼用法
!/bin/bash
# 跳轉到指令碼所在目錄
cd $(dirname "$0") || exit 1
# 對上面的指令碼的解釋
$0 當前Shell程式的檔名
dirname $0 獲取當前Shell程式的路徑
cd $(dirname $0) 進入當前Shell程式的目錄
exit 1 如果獲取不到則退出指令碼
[basename]
basename命令用於去掉檔名的目錄和字尾(strip directory and suffix from filenames),對應的dirname命令用於擷取目錄
★常用示例
示例一 # 獲取到最後檔名sort
[root@local ~]# basename /usr/bin/sort
sort
示例二 # 去除檔名字尾
[root@local ~]# basename /usr/include/stdio.h .h
stdio
[root@local ~]# basename /usr/include/stdio.h stdio.h
stdio.h
示例三 # 去除檔名字尾方式的另外一種方法
[root@local ~]# basename -s .h /usr/include/stdio.h
stdio
示例四 # 獲取多個目錄下的檔案列表,以換行符\n為分隔
[root@local ~]# basename -a dir1/file1 dir2/file2
file1
file2
示例五 # 獲取多個目錄下的檔案列表,以NUL為分隔
[root@local ~]# basename -a -z dir1/file1 dir2/file2
file1file2