Linux下dirname命令详解及C/C++代码实现

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)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值