dirname命令的基本用法非常简单——只需写下命令名,后跟文件的绝对名称即可。 在输出中,将获得完整的目录树,但文件名除外。
linux dirname 命令
以下是 dirname 命令的通用语法:
dirname NAME
以下是该工具的手册页对其的描述:
输出每个 NAME 并删除其最后一个非斜杠组件并删除尾部斜杠; 如果 NAME 包含
没有/,输出’.’ (表示当前目录)。
dirname /opt/code/linux_command_code/
dirname 处理多个目录?
以上需要做的就是一个接一个地传递绝对目录或者文件名。
文件名是绝对名称会输出什么?
如果输入只是一个文件名(不是绝对的,包含目录树),那么在输出中会产生一个点 (.)。
dirname() 和 basename() 针对不同路径返回的字符串
path dirname basename
"/usr/lib" "/usr" "lib"
"/usr/" "/" "usr"
"usr" "." "usr"
"/" "/" "/"
"." "." "."
".." "." ".."
函数 dirname() 和 basename() 将一个以 null 结尾的路径名字符串分解为目录和文件名组件。 在通常情况下,dirname() 返回字符串直到最后的’/’,但不包括最后的’/’,而basename() 返回最后的’/’ 之后的组件。 尾随 ‘/’ 字符不计入路径名的一部分。
如果 path 不包含斜杠,则 dirname() 返回字符串“.” 而 basename() 返回路径的副本。 如果 path 是字符串“/”,那么 dirname() 和 basename() 都返回字符串“/”。 如果 path 是 NULL 指针或指向空字符串,则 dirname() 和 basename() 都返回字符串“.”。
连接 dirname() 返回的字符串、“/”和 basename() 返回的字符串会产生一个完整的路径名。
dirname() 和 basename() 都可以修改 path 的内容,因此在调用这些函数之一时可能需要传递一个副本。
这些函数可能会返回指向静态分配内存的指针,这些指针可能会被后续调用覆盖。 或者,它们可能会返回指向路径某些部分的指针,因此在不再需要函数返回的指针之前,不应修改或释放路径引用的字符串。
下面来个简单例子实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libgen.h>
int main(int argc, char **argv)
{
char *dirc, *basec, *bname, *dname;
const char *path = "/usr/lib";
dirc = strdup(path);
basec = strdup(path);
dname = dirname(dirc);
bname = basename(basec);
printf("dirname=%s, basename=%s\n", dname, bname);
free(dirc);
free(basec);
return 0;
}
编译运行:
Linux下dirname命令代码实现
int main(int argc, char **argv)
{
char *p;
char *string;
if (argc == 1)
{
puts(".");
return 0;
}
if (strcmp(argv[1], "--") == 0)
{
argv++;
argc--;
if (argc == 1)
{
puts(".");
return 0;
}
}
if (argc > 2)
{
fprintf(stderr, "Usage: dirname [ path ]\n");
return 1;
}
string = argv[1];
if (*string == '\0')
{
puts(".");
return 0;
}
/* 删除尾部斜杠 */
...
/* 字符串只包含斜杠 */
...
/* 删除非斜线 */
...
/* 删除分隔 dirname 和 basename 的斜线 */
...
...
/* 现在字符串指向目录名部分 */
puts(string);
return 0;
}
编译运行:
如果路径名 path 不包含 斜杠 ‘/’, dirname 返回 字符串 “.”
总结
dirname命令去除文件名中的非目录部分,删除最后一个“\”后面的路径,显示父目录,这个命令要放在shell脚本中使用意义更好。
欢迎关注微信公众号【程序猿编码】,需要dirname命令完整源码的添加本人微信号(c17865354792)