使用dirname命令获取路径名的目录部分在Linux中,可以使用dirname命令获取路径名的目录部分路径名,不包括路径名末尾的文件名。检查mandirname以获取如下说明:dirname[OPTION]NAME...dirname-从文件名中删除最后一个组件。输出每个NAME的最后一个非斜线组件和尾部斜线被删除;如果NAME不包含/'s,则输出'.'(表示当前目录)。也就是说,dirname命令可以获得给定路径名的目录部分,即从最后一个/字符开始的部分,不包括/字符本身。如果给定的路径名??不包含/字符,则返回的目录部分是一个点“.”,这被认为是当前目录。给定的路径名??参数不需要是真实的路径,dirname只是处理给定的路径名??字符串。dirname命令可以提供多个路径名参数,默认情况下会逐行打印每个路径名的目录部分。如果不想打印换行符,可以使用-z选项。该选项的说明如下:-z,--zero用NUL而不是换行符单独输出具体例子如下:$dirnameapp/Phone.apksrc/lib/utils.cappsrc/lib$dirnameutils.c.$dirname-zapp/Phone.apksrc/lib/utils.cappsrc/lib$可以看到,dirnameapp/Phone.apksrc/lib/utils.c命令逐行打印给定的目录部分两个路径名。dirnameutils.c命令的路径名参数不包含/字符,打印出来的目录部分是一个点‘.’。dirname-zapp/Phone.apksrc/lib/utils.c使用-z选项指定获取到的目录部分后不加换行符,则打印结果全部在同一行,不加换行符。打印结果末尾的$字符是命令行提示符。使用basename命令获取路径名的文件名部分在Linux中,您可以使用basename命令获取路径名的文件名部分,不包括文件名前面的目录路径。检查manbasename的说明如下:basenameNAME[SUFFIX]basenameOPTION...NAME...basename-从文件名中剥离目录和后缀。打印NAME并删除任何前导目录组件。如果指定,还删除尾随的SUFFIX。也就是说,basename命令可以获得给定路径名的文件名部分,即从最后一个/字符开始的部分,不包括/字符本身。当只提供一个pathname参数时,后面可以提供一个可选的SUFFIX参数,指定去掉文件名的后缀部分。默认情况下,basename仅处理路径名参数。如果要处理多个路径名参数,则需要使用-a选项。该选项的说明如下:-a,--multiple支持多个参数并将每个参数视为一个NAME当使用-a选项指定多个路径名参数时,basename逐行打印每个路径名的文件名部分。如果你不想换行打印,你可以再次使用-z选项。该选项的说明如下:-z,--zero用NUL而不是换行符单独输出当提供多个路径名参数时,如果要指定去掉文件名的后缀部分,需要使用-s选项,该选项的说明如下:-s,--suffix=SUFFIX去掉尾随的SUFFIX具体例子如下:$basenamesrc/lib/utils.cutils.c$basenamesrc/lib/utils.c.cutils$basename-s.csrc/lib/utils.cutils$basename-asrc/lib/utils.csrc/main.cutils.cmain.c$basename-a-s.csrc/lib/utils.csrc/main.cutilsmain$basename-a-zsrc/lib/utils.csrc/main.cutils.cmain.c$可以看到basenamesrc/lib/utils.c命令获取给定路径的文件名name部分,也就是utils.c。basenamesrc/lib/utils.c.c命令指定将获取的文件名去掉.c后缀,返回u??tils。basename-s.csrc/lib/utils.c命令使用-s.c指定获取的文件名去掉.c后缀,去掉的文件名后缀必须在-s选项后提供.basename-asrc/lib/utils.csrc/main.c命令使用-a选项指定对多个路径名的处理,可以防止后面的文件名被当作SUFFIX参数,而得到的多个文件名称将逐行打印。basename-a-s.csrc/lib/utils.csrc/main.c该命令通过-a选项指定处理多个路径名,通过-s指定去掉获取的文件名的.c后缀。C。basename-a-zsrc/lib/utils.csrc/main.c命令通过-a选项指定对多个路径名的处理,通过-z指定获取到的文件名部分后不加换行符option,则打印结果全部在同一行,没有换行。打印结果末尾的$字符是命令行提示符。使用bash参数扩展获取文件名的后缀在bash中,可以使用参数扩展(parameterexpansion)表达式获取文件名的后缀。具体说明如下:${filename##*.}这个表达式匹配filename变量的值。这个字符,直到最后一个匹配,然后返回该字符后面的部分,即文件名的后缀,不包括.这个角色。注意:${filename##*.}这个表达式是bash的参数扩展表达式,filename会被当作一个变量名,获取变量值进行参数扩展。它不能直接处理字符串,filename不会被当作字符串处理,必须把字符串赋值给一个变量,然后把变量名放在表达式中处理。具体例子如下:c"$echo${filename##*.}c$filename="utils.1.c"$echo${filename##*.}c$echo'.'${filename##*.}.c$filename="util"$echo${filename##*.}util可以看到echo${src/lib/utils.c##*.}的命令输出为空.在这里,src/lib/utils.c并没有被当做一个字符串来处理,而是当做一个变量名。目前没有这个变量,变量值为空,匹配结果也为空。将“src/lib/utils.c”赋值给filename变量后,echo${filename##*.}命令打印出filename变量的值对应的字符串的后缀,即c,这样做不包含.特点。修改filename变量的值为“utils.c”,echo${filename##*.}命令也打印出对应的后缀。将文件名变量分配给“utils.1.c”,其中包含多个.字符,并且${filename##*.}表达式将匹配到最后一个.字符,返回字符后面的部分。由于此表达式获得的后缀不包含.字符,如果你需要添加一个。字符,你可以主动在表达式前加上这个字符。例如,'.'${filename##*.}将添加一个.表达式返回值之前的字符。请注意,当给定的变量值不包含.字符,此表达式返回变量值本身。将filename变量值修改为“util”,echo${filename##*.}命令打印变量值本身。当${filename##*.}返回的值等于$filename的值时,说明filename变量的值不包含后缀。字符,也就是说,它没有后缀。
