发布网友 发布时间:2022-04-21 10:33
共5个回答
热心网友 时间:2023-11-09 15:56
创建软连接,命令如下:
ln -s / /home/good/linkname
ln的链接分软链接和硬链接两种:
1、软链接就是:“ln –s 源文件 目标文件”,只会在选定的位置上生成一个文件的镜像,不会占用磁盘空间,类似与windows的快捷方式。
2、硬链接ln源文件目标文件,没有参数-s, 会在选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
扩展资料
软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。
链接文件甚至可以链接不存在的文件,这就产生一般称之为”断链”的现象,链接文件甚至可以循环链接自己。类似于编程语言中的递归。
软链接文件只是其源文件的一个标记,当删除了源文件后,链接文件不能存在,虽然仍保留文件名,但却不能查看软链接文件的内容了。
用ln -s 命令可以生成一个软连接,如下:
[root@linux236 test]# ln -s source_file softlink_file
在对符号文件进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。
删除硬/软链接用rm softlink_file
或者unlink softlink_file
参考资料:百度百科—软链接
热心网友 时间:2023-11-09 15:57
最近在使用 fs.symlink 实现软链时,发现文档里面写的是:fs.symlink(target, path);然而 man ln 的时候显示的是:ln source_file target_file;而且,require 模块的时候其实还会处理软链但是处理的又不是想象中那样。于是,我彻底被相关东西绕晕。这篇文章算是我的学习笔记,希望对你有帮助。
inode
我们首先来看看 Linux 系统里面的一个重要概念:inode。
我们知道,文件存储在硬盘上,硬盘存储的最小单位是扇区(sector,每个扇区 512 B)。而操作系统读取文件时,按块读取(连续的多个扇区),也就是说文件存取的最小单位是块(block,块通常是 4 KB)。
除了文件数据,我们还必须存储文件的元信息(如:文件大小、文件创建者、文件数据的块位置、文件读/写/执行权限、文件时间戳等等),这种存储文件元信息的结构就称为 inode。我们可以使用 stat 命令查看文件的 inode 信息。在 Node.js 中,调用 fs.stat后返回的结果中也有相关信息
每个 inode 都有一个唯一的号码标志,Linux 系统内部使用 inode 的号码来识别文件,并不使用文件名。我们打开一个文件时,系统首先找到文件名对应的 inode 号码,然后通过 inode 号码获取 inode 信息,最后根据 inode 信息中的文件数据所在的 block 读出数据。
实际上,在 Linux 系统中,目录也是一种文件。目录文件包含一系列目录项,每个目录项由两部分组成:所包含文件的文件名,以及该文件名对应的 inode 号码。我们可以使用 ls -i 来列出目录中的文件以及它们的 inode 号码。这其实也解释了仅更改目录的读权限,并不能实现读取目录下所有文件内容的原因,通常需要 chmod -R 来进行递归更改。
总结下:硬盘存取的最小单位是扇区,文件存取的最小单位是块(连续的扇区)存储文件元信息(文件大小、创建者、块位置、时间戳、权限等非数据信息)的结构称为 inode每个 inode 拥有一个唯一号码,系统内部通过它来识别文件目录也是一种文件,其内容包含一系列目录项(每个目录项由文件的文件名和文件对应的 inode 号码组成)
硬链接和软链接
硬链接
一般情况,一个文件名“唯一”对应一个 inode。但是,Linux 允许多个文件名都指向同一个 inode。这表示我们可以使用不同的文件名访问同样的内容;对文件内容进行修改将“反映”到所有文件;删除一个文件不影响另一个文件的访问 。这种机制就被称为“硬链接”。
我们可以使用 ln source target 来建立硬链接(注意:source 是本身已存在的文件,target 是将要建立的链接)。
形象化的表示为下图:
需要注意的是,只能给文件建立硬链接,而不能给目录建立硬链接。另外,source 文件必须存在,否则将会报错。
删除一个文件为什么不影响另一个文件的访问呢?实际上,文件 inode 中还有一个链接数的信息,每多一个文件指向这个 inode,该数字就会加 1,每少一个文件指向这个 inode,该数字就会减 1,当值减到 0,系统就自动回收 inode 及其对应的 block 区域。很像是一种引用计数的垃圾回收机制。
当我们对某个文件建立了硬链接后,对应的 inode 的链接数会是 2(原文件本身已经有一个指向),当删除一个文件时,链接数变成 1,并没达到回收的条件,所以我们还是可以访问文件。
软链接
软链接类似于 Windows 中的”快捷方式“。两个文件虽然 inode 号码不一样,但是文件 A 内部会指向文件 B 的 inode。当我们读取文件 A 时,系统就自动导向文件 B,文件 A 就是文件 B 的软链接(或者叫符号链接)。这表示我们同样可以使用不同的文件名访问同样的内容;对文件内容修改将”反映“到所有文件。但是当我们删除掉源文件 B 时,再访问文件 A 时会报错 “No such file or directory”。
我们可以使用 ln -s source target 来建立软链接(注意:表示让 target “指向” source)。
形象化的表示为下图:
和硬链接不同,我们可以给目录建立软链接,这带来许多便利。比如我们有一个模块有很多个版本,分别存放在 1.0.0、2.0.0 这样的目录下面,当更新模块时,只需要建立一个软链接指向最新版本号的目录就能很方便的切换版本。
另外,建立软链接时,source 是可以不存在的。这很像一种”运行时“机制,而不是“编译时”机制,建立的时候不报错,等执行的时候发现找不到就报错了。
总结使用 ln source target 建立硬链接;使用 ln -s source target 建立软链接硬链接不会创建额外 inode,和源文件共用同一个 inode;软链接会创建额外一个文件(额外 inode),指向源文件的 inode建立硬链接时,source 必须存在且只能是文件;建立软链接时,source 可以不存在而且可以是目录删除源文件不会影响硬链接文件的访问(因为 inode 还在);删除源文件会影响软链接文件的访问(因为指向的 inode 已经不存在了)对于已经建立的同名链接,不能再次建立,除非删掉或者使用 -f 参数
关于软链接的补充
上面的例子 ln -s file file-soft 给我们的感觉像是 file-soft 是“凭空”出现的。当我们跨目录来创建软链接时,可能会“幻想”这样的命令也是可以生效的:ln -s ~/development/mod ~/proction/dir-not-exits/mod。
这里并没有 ~/proction/dir-not-exits/ 这个目录,而软链接本质上是一个新的“文件”,所以,我们不可能正确建立软链接(会报错说 “no such file or directory”)。
如果我们先通过 mkdir 建立好目录 ~/proction/dir-not-exits/,再进行软链接,即可达到预期效果。
fs.symlink
在 Node.js 中,我们可以使用方法 fs.symink(target, path) 建立软链接(符号链接),没有直接的方法建立硬链接(就算通过子进程的方式直接指向 shell 命令也不能跨平台)。
如果是对目录建立链接,请总是传递第三个参数 dir(虽然第三个参数只在 Windows 下生效,这可以保证代码跨平台):fs.symlink(target, path, 'dir')。
为啥这个接口的参数会是 target 和 path。实际上这是一个 Linux 的 API,symlink(target, linkpath)。它是这样描述的:建立一个名为 linkpath 的符号链接并且含有内容 target。其实就是让 linkpath 指向 target,和 ln -s source target 功能一样,让 target 指向 source。
是不是有点晕?其实我们只需要明白 ln -s 和 fs.symlink 后面传递的两个参数顺序是一致的,只是叫法不一样,使用起来也就没那么纠结了:
require
在 Node.js 中,我们经常通过 require 来引用模块。非常有趣的是,require 引用模块时,会“考虑”符号链接,但是却使用模块的真实路径作为 __filename、__dirname,而不是符号链接的路径。
考虑下面的目录结构:
以及下面的文件内容:
执行 node index.js 后输出是下面这样:
我们发现,index.js 可以成功的 require('dep1')。这很好啊,这让我们调试本地开发中的 npm 模块很方便。我们只需要去 require 模块的文件所在的 node_moles 下面建立一个符号链接就行了。
但是在模块 dep1 中,__dirname、__filename 都变成了模块实际的路径,更要命的是模块查找路径 mole.paths 也变成了从实际路径开始查找。
这会带来什么问题?
再考虑下面的目录结构:
以及下面的文件内容:
当我们再执行 node index.js 时,输出是下面这样:
发现了吗?dep1 根本就 require 不到 dep2,因为 dep2 不在它的查找路径里面!
关于这个问题,github 上有一个冗长的 issue 在讨论。问题解决起来确实很麻烦,而且会 break 掉一大堆已有功能,所以,最终的结论是在找到更好的方法前给 Node.js v6 增加了一个 --preserve-symlinks 选项来禁止这种 require 的行为,而是使用全新的 require 逻辑。有兴趣和闲情的可以去围观:https://github.com/nodejs/node/issues/3402(真的好长……)。
至于全新的 require 逻辑会不会有新的坑,在没有具体实践前,我也不知道。
那我们上面的情况有办法解决吗?其实也有,那就是将目录结构调整成下面这样,从而让 dep2 能在 dep1 的查找路径里面:
参考链接http://www.ruanyifeng.com/blog/2011/12/inode.htmlhttp://www.geekride.com/hard-link-vs-soft-link/http://man7.org/linux/man-pages/man2/symlink.2.htmlhttps://nodejs.org/api/fs.htmlhttps://github.com/nodejs/node/issues/3402
2018-11-05 回答
java服务端
分布式服务架构
java并发编程
JavaScript生态体系
大数据与人工智能
数据库
服务器运维
全文搜索
W3C&前端开发
项目构建管理
php
编程语言
常用软件
软件测试
java教程
freemarker教程
ActiveMQ教程
RabbitMQ 教程
kafka教程
spring教程
Spring Batch教程
Spring Boot教程
Spring MVC教程
httpclient 教程
Netty教程
shiro教程
MyBatis 教程
Hibernate教程
JPA教程
OAuth 2.0教程
activiti工作流教程
Quartz教程
Guava教程
Kotlin教程
Apache Commons教程
WebSocket教程
POI教程
Struts2教程
HTTP教程
TCP/IP教程
YAML教程
Web Services教程
Memcached教程
JFinal教程
jsp&servlet教程
jstl el 教程
JSoup教程
JSON教程
tomcat教程
JFreeChart教程
XStream教程
Thymeleaf教程
Groovy教程
Log4j教程
JasperReports教程
正则表达式
i18n 国际化
JSF教程
设计模式
JAVA GUI教程
JOGL教程
PDFBox教程
相关问答
更多
LINUX LN命令 怎么操作
最直接的方式就是在终端中 man ln然后就是详细说明。 ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件。 使用方式 : ln [options] source dist,其中 option 的格式为 :[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}] ln source dist 是产生一个连结(dist)...
linux中的ln命令如何使用?举2个具体例子!谢谢!
ln命令用来建立链接文件 命令格式:ln [选项] 源文件或目录 链接名或目录 常用选项: -s 建立符号链接 -f 强行建立链接 -i 交互式建立链接 例:要为当前目录下的file文件建立一个硬链接,名为/home/lbt/doc/file/,可用如下命令: ln file /home/lbt/doc/file 建立名为 /home/lbt/doc/file1 的符号链接: ln -s file /home/lbt/doc/file1
创建符号链接以供其他Linux实例使用(Creating a symbolic link for use by another Linux instance)
符号链接时应使用相对路径,例如 cd /home/paul/target/rootfs/etc/init.d ln -s mndns ../rc0.d/K16mdns You should use relative paths when symlinking, e.g. cd /home/paul/target/rootfs/etc/init.d ln -s mndns ../rc0.d/K16mdns
Unix中的硬链接和符号链接(Hard link and Symbolic links in Unix)
是的,没有:-) 在UNIX中,文件的内容与该文件的目录条目不同。 您可以有多个目录项指向相同的内容(查找inode以获取有关这个工作原理的描述),这里有一个棘手的问题: 所有这些目录条目都是相同的。 尽管可能先创建了一个,但没有什么特别的。 如果删除它,内容不会消失,只是目录条目。 一旦inode有零个目录项指向它,内容就会消失(并且所有进程都关闭该文件 - 我之前尝试清除删除日志文件的磁盘空间以找到该文件,因为进程仍然有文件打开,即使没有目录条目指向它们,也不会恢复文件内容)。 这是硬链接。 ...
linux mysql 启动问题
你在 ln -s /sbin/mysql /usr/local/mysql 看看
Proguard - 删除日志roboguice.util.Ln(Proguard - removing logs roboguice.util.Ln)
您对roboguice.util.Ln配置看起来是正确的。 但是,选项-assumenosideeffects仅在启用优化时生效。 在Android构建中,这意味着:在发布模式下,在project.properties针对Ant的共享配置proguard-android-optimize.txt ,或者针对Gradle使用build.gradle 。 Your configuration for roboguice.util.Ln looks correct. However, the optio...
linux的根目录下面都包含什么目录
linux根目录下各文件夹的作用 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示 /lib 标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件 /sbin 系统管理命令,这里存放的是系统管理员使用的管理程序 /tmp 公用的临时文件存储点 /root 系统管理员的主目录(呵呵,特权阶级) /mnt ...
在Linux上编译驱动程序问题,怎么解决
可以用ln -s命令创建一个软连接,也就是快捷方式 它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。 当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的 目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。 例如:ln -s /bin/less /usr/local/bin/less -s 是代号(symbol...
最新问答
更多
我在哪里可以找到Visual Studio 2015中的Microsoft.TeamFoundation.Build.Client?(Where can I find Microsoft.TeamFoundation.Build.Client in Visual Studio 2015?)
Microsoft.TeamFoundation.Build.Client.dll仍与VS 2015一起发布。对于2015版本,我们已从GAC中删除了客户端OM DLL。 在RC版本中,您可以在c:\ program files(x86)\ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TeamFoundation \ Team Explorer中找到该DLL。 这是一个不起眼的地方。 T...
为什么选择计数明显不能在yii中工作?(Why is select count distinct not working in yii?)
$count_participants = BridgeMeeting::Model()->with('idUserRegistry')->count(array( 'condition' => 'id_meeting=:id_meeting', 'select' => 'id_user_registry', 'distinct' => true, 'params' => array( ":id_meeting" => $data->id_meeti...
无法将参数传递给SAS宏(Fail to Pass Parameter to SAS Macro)
您无法在宏调用中引用数据步变量的值。 因此,在您的宏调用中,值VAR_NAME只是作为要在其生成的PROC中使用的变量名称传递给宏。 你不能在彼此之间嵌套步骤。 当宏调用执行时,它会生成SAS代码,然后由SAS编译和执行。 当SAS看到PROC或DATA步骤启动时,它会立即停止编译当前步骤。 因此,当SAS看到宏调用生成的PROC语句时,您的数据步骤将具有未闭合的DO循环。 您可以使用新宏来生成对现有宏的多个调用。 %macro run_charts(varlist); %local i ; ...
shell_exec无法返回dig命令的输出(shell_exec cannot return output of the dig command)
以下是否显示您的情况? echo shell_exec("dig google.com AAAA 2>&1"); 我会使用exec() ,你可以传递一个包含所有输出的变量,如果你给它一个returnvar,它将包含退出状态。 Does the following show you anyting? echo shell_exec("dig google.com AAAA 2>&1"); I would use exec() though, you can pass it a variabl...
Android中的分组水平按钮组(Grouped Horizontal Button Group in Android)
你可以为每个人制作Shape文件。 只需创建Shape文件,并定义特定按钮的角半径并使用它。 例如顶部按钮1 像这样设置按钮背景 <Button android:id="@+id/btn1" android:text="Click" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/mycorner"/> 在drawable文件夹...
Java:对象字段赋值(Java: object fields assignment)
当你做Student bob = new Student()你正在创建一个Student类的实例,并在bob变量中保存对该位置的引用。 当你执行jian = bob ,你将相同的引用保存在jian变量中的内存位置,所以现在jian和bob指向Student类的完全相同的实例 。 When you do Student bob = new Student() you're creating an instance of the Student class, and saving a referenc...
Intellij和当地Tomee 7.0.1(Intellij and local Tomee 7.0.1)
这个版本的想法是什么? 当7.x发布时,他们有一个bug,你需要自定义它们传递给tomee部署者的属性以及tomee属性,但它在最近的版本中已经修复。 which version of idea is it? They had a bug when 7.x was released and you needed to customize the properties they passed to the deployer of tomee as well as tomee properties b...
如何根据上述条件转换字符串以及如何将这个新转换的字符串作为文件名应用于用户上传的文件?(How to convert a string according to said criteria and how to apply this newly converted string as a file name to the file uploaded by user?)
使用$_POST['pt_doc_title']在PHP脚本中接收标题 使用strtolower()将标题转换为小写 使用str_replace()替换所有带下划线的空格 使用rename()函数重命名用户上传的文件 这应该让你开始: if (isset($_POST['submit'])) { $title = $_POST['pt_doc_title']; $title = strtolower($title); $title = str_replace(' ', '_...
bundle:找不到命令(bundle: command not found)
您需要将ruby gem可执行文件目录添加到路径中 export PATH=$PATH:/opt/ruby-enterprise-1.8.7-2010.02/bin You need to add the ruby gem executable directory to your path export PATH=$PATH:/opt/ruby-enterprise-1.8.7-2010.02/bin
如何在遇到特殊字符时拆分列(how to split column when meet special character)
以下解决方案应该有效 [1]无论哪个订单用于Comment栏目( Reg, Inv, Cus Br或Cus, Br, Reg, Inv或其他)以及 [2] Comment栏的某些项目可能会丢失(例如,缺少TEST4 / Cus) [3]如果Comment包含XML保留字符,则代替REPLACE(t1.Comment,应该使用REPLACE((SELECT t1.Comment AS '*' FOR XML PATH('')), DECLARE @Table1 TABLE ( ID ...
热心网友 时间:2023-11-09 15:57
创建软连接,命令如下:
ln -s / /home/good/linkname
ln的链接分软链接和硬链接两种:
1、软链接就是:“ln –s 源文件 目标文件”,只会在选定的位置上生成一个文件的镜像,不会占用磁盘空间,类似与windows的快捷方式。
2、硬链接ln源文件目标文件,没有参数-s, 会在选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
热心网友 时间:2023-11-09 15:58
ln -s / /home/good/linkname追问哦,谢谢,可以了,直接链接到已存在的目录,会链接本身。
太谢谢了!加10分,呵呵
追答不懂的命令可以用help或man工具,比如你试试敲ln --help或者man ln
热心网友 时间:2023-11-09 15:58
根目录是顶级目录,无法链接的追问哦,那有办法把根目录下的文件和文件夹全连接到 一个文件夹下吗
追答刚才实践了下,发现我原先的说法是错误的,根目录也是可以链接的。呵呵,linux真是无所不能啊
sudo ln -s / /home/good
就可以了