Linux ln 命令是什么?C/C++代码实现

在Linux中,在命令行上工作时,需要在文件之间创建链接,将文件名与文件数据相关联。这可以使用名为 ln 的专用命令来实现。

什么是链接?

在讨论 ln 命令之前,让我们先讨论一下链接命令,什么是链接,以及它与我们所知道的文件的关系。

链接是文件系统中的一个条目,它将文件名连接到磁盘上的实际数据字节。 多个文件名可以“链接”到相同的数据。

Linux ln 命令

ln 命令用于创建文件或目录的链接。 (“ln”是“link”的缩写。)该命令提供给Linux命令行(也称为shell),可以使用终端窗口打开和操作。 它是最重要和最常用的终端命令之一,可用于创建软链接或硬链接。

ln 的基本语法是

ln [选项] 目标链接

或者

ln [选项] 目标 [目录]

默认情况下,ln 创建硬链接,它们只是现有文件的附加名称。硬链接不能指向目录,也不能跨越文件系统和分区边界。

访问 man ln 页面或在终端中键入 man ln 以获取有关 ln 命令的更多信息。

在这里插入图片描述

ln选项:
在这里插入图片描述

什么是软链接和硬链接?

如果你想充分利用 ln 命令,你需要知道软链接和硬链接之间的区别。

软链接也称为符号链接,是指向文件或目录的交叉引用。在 Windows 中,软链接类似于快捷方式。它是指向不可直接访问的文件或位置的指针。如果移动或删除原始文件,则不再有目标,链接将一无所获。

硬链接是原始文件的镜像副本,它有自己的目录条目。硬链接与 Linux 中的特殊内部簿记密切相关。每个硬链接都指向一个 inode,并被分配一个唯一的 inode 编号,该编号与分配给原始文件的编号相同。

如何使用 ln 创建硬链接?

没有任何参数情况下,默认ln命令生成硬链接。

ln file1 link1

如果提供了两个文件名作为参数,则 ln 使用第二个文件名,假设它不是现有文件的名称,作为指向第一个文件的硬链接的名称。因此,例如,以下将创建一个名为 link1 的链接到名为 file1 的文件:

在这里插入图片描述虽然硬链接是操作系统工作方式的重要组成部分,但软链接通常更方便。

如何使用 ln 创建软/符号链接?

ln 的几个选项中最有用的是 -s,它会导致它创建一个符号链接,也称为软链接,而不是硬链接。与硬链接相比,符号链接有几个优点,包括跨越文件系统和分区边界的能力。此外,对原始文件所做的任何更改也会自动对链接进行,反之亦然。

在这里插入图片描述
20220417文件是一个软/符号链接,由它的天蓝色文本颜色确认。

如何使 ln 删除现有的同名目标文件

默认情况下,如果目标目录中已存在同名文件,ln 不会让您创建链接。但是,如果需要,可以使用 -f 命令行选项使 ln 覆盖此行为。

在这里插入图片描述
使用 -f (–force) 选项重写符号链接的目标路径。

Linux 下ln 命令 C/C++代码实现

int main(int argc, char *argv[])
{
	struct stat sb;
	int ch, exitval;
	char *sourcedir;

	while ((ch = getopt(argc, argv, "finsv")) != -1)
		switch (ch) 
		{
			case 'f':
				fflag = 1;
				iflag = 0;
				break;
			case 'n':
				hflag = 1;
				break;
			case 'i':
				iflag = 1;
				fflag = 0;
				break;
			case 's':
				sflag = 1;
				break;
			case 'v':               
				vflag = 1;
				break;
			case '?':
			default:
				usage();

		}

	argv += optind;
	argc -= optind;

	if (sflag) 
	{
		linkf  = symlink;
		linkch = '-';
	} 
	else 
	{
		linkf  = link;
		linkch = '=';
	}

	switch(argc) 
	{
		case 0:
			usage();
		case 1:				/* ln target */
			exit(linkit(argv[0], ".", 1));
		case 2:				/* ln target source */
			exit(linkit(argv[0], argv[1], 0));
	}

					/* ln target1 target2 目录 */
	sourcedir = argv[argc - 1];
	if (hflag && lstat(sourcedir, &sb) == 0 && S_ISLNK(sb.st_mode))
	{

		errno = ENOTDIR;
		err(EXIT_FAILURE, "%s", sourcedir);

	}
	if (stat(sourcedir, &sb)) 
	{
		err(EXIT_FAILURE, "%s", sourcedir);

	}
	if (!S_ISDIR(sb.st_mode)){
		usage();

	}
	for (exitval = 0; *argv != sourcedir; ++argv)
		exitval |= linkit(*argv, sourcedir, 1);
	
	exit(exitval);
}

编译运行:

在这里插入图片描述

总结

ln 是一个用于将文件链接在一起的命令行工具。 ln 命令默认生成硬链接。使用 -s (–symbolic) 选项建立符号连接。

欢迎关注微信公众号【程序猿编码】,需要ln 命令完整源码的添加本人微信号(c17865354792)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值