您的位置:首页 > 其它

basename与dirname命令解析

2013-04-07 10:30 218 查看
basename命令

语法:basename string [suffix]

用于返回一个字符串的基本文件名称

basename命令读取string参数,删除以 / 结尾的前缀以及任何指定的suffix参数,并将剩余的基本文件名称写至标准输出。

basename命令应用以下创建基本文件名称的规则:

1· 如果 String 参数是 //(双斜杠) 或如果 String 参数包含的都是斜杠字符,则将字符串更改为单个 /(斜杠)。跳过步骤 2 到 4。

从指定字符串除去任何拖尾的 / 字符。

2· 如果在 String 参数中剩余任何 / 字符,则除去字符串的前缀直到(包含)最后一个 / 字符。

3· 如果指定 Suffix 参数,且它和字符串中的剩余的字符相同,则不修改此字符串。例如,输入:

# basename /u/dee/desktop/cns.boo cns.boo

结果是:

cns.boo

如果指定 Suffix 参数,且它和字符串中所有字符都不相同,但和字符串的后缀相同,则除去指定后缀。例如,输入:

# basename /u/dee/desktop/cns.boo .boo

结果是:

cns

不能在字符串中查找到指定的后缀不作为错误处理。

示例

(1)要显示一个 shell 变量的基本名称,请输入:

basename $WORKFILE

此命令显示指定给 shell 变量 WORKFILE 的值的基本名称。如果 WORKFILE 变量的值是 /home/jim/program.c 文件,则此命令显示 program.c

# basename
/usr/bin/sort

# sort

(2)要构造一个和另一个文件名称相同(除了后缀)的文件名称,请输入:

OFILE=`basename $1 .c`.o

此命令指定给 OFILE 文件第一个位置上的参数($1)的值,但它的 .c 后缀更改至 .o。如果 $1 是 /home/jim/program.c 文件,则 OFILE 成为 program.o。因为 program.o 仅是一个基本文件名称,它标识在当前目录中的文件。

注:`(重音符号)指定命令替换。

dirname命令

用途说明

dirname命令可以取给定路径的目录部分(strip non-directory suffix from file name)。这个命令很少直接在shell命令行中使用,我一般把它用在shell脚本中,用于取得脚本文件所在目录,然后将当前目录切换过去。根据手册页上说的“Print NAME with its trailing /component removed; if NAME contains no /’s, output ‘.’ (meaning the current directory).”,似乎说“取给定路径的目录部分”
并不能很准确的概括dirname命令的用途。Linux下还有一个命令是basename,它与dirname相反,是取得文件名称部分。

常用参数

无。

使用示例

示例一 来自手册页的例子

[root@qzt196 ~]# dirname /usr/bin/sort

/usr/bin

[root@qzt196 ~]# dirname stdio.h

.

[root@qzt196 ~]#

示例二

[root@qzt196 ~]# dirname /usr/bin

/usr

[root@qzt196 ~]# dirname /usr/bin/

/usr

注意:此处的输出结果,似乎有点怪。这应该看下dirname命令的源代码才能解释了。

示例三 在bash脚本中的运用

Bash代码
#!/bin/sh

# 跳转到脚本所在目录
cd $(dirname "$0") || exit 1

# 剩下的部分


这个写法我经常用到,因为有时候脚本执行时无法确定是在哪个目录,比如脚本用在crontab中时。

另一个写法是:cd `dirname $0` 其中反引号··等同于$()。

示例四 与另外一种截取目录的方法的比较

可以用${pathname%/*}截取掉pathname后面的文件部分。

[root@jfht ~]# pathname=/usr/bin/sort; echo $(dirname $pathname) ${pathname%/*}

/usr/bin /usr/bin

[root@jfht ~]# pathname=/usr/bin/; echo $(dirname $pathname) ${pathname%/*}

/usr /usr/bin

[root@jfht ~]# pathname=/usr/bin; echo $(dirname $pathname) ${pathname%/*}

/usr /usr

[root@jfht ~]# pathname=/usr/; echo $(dirname $pathname) ${pathname%/*}

/ /usr

[root@jfht ~]# pathname=/usr; echo $(dirname $pathname) ${pathname%/*}

/

[root@jfht ~]# pathname=/; echo $(dirname $pathname) ${pathname%/*}

/

[root@jfht ~]# pathname=stdio.h; echo $(dirname $pathname) ${pathname%/*}

. stdio.h

[root@jfht ~]#

path            dirname         basename
"/usr/lib"      "/usr"           "lib"
"/usr/"         "/"              "usr"
"usr"           "."              "usr"
"/"             "/"               "/"
"."             "."               "."
".."            "."              ".."


参考资料:http://study.chyangwa.com/IT/AIX/aixcmds1/basename.htm
http://codingstandards.iteye.com/blog/840784 http://codingstandards.iteye.com/blog/800028
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: