发布时间:2025-12-09 16:23:21 浏览次数:2
dirname命令的基本用法非常简单——只需写下命令名,后跟文件的绝对名称即可。 在输出中,将获得完整的目录树,但文件名除外。
linux 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;}编译运行:
dirname命令去除文件名中的非目录部分,删除最后一个“\”后面的路径,显示父目录,这个命令要放在shell脚本中使用意义更好。
欢迎关注微信公众号【程序猿编码】,需要dirname命令完整源码的添加本人微信号(c17865354792)