有同学问,如何/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