【问题标题】:Symlinks not working when link is made in another directory?在另一个目录中建立链接时符号链接不起作用?
【发布时间】:2012-01-25 23:35:47
【问题描述】:

哇,我以前从来没有真正使用过符号链接,但这真是令人难以置信:

bash-3.2$ echo "weird" > original.txt
bash-3.2$ mkdir originals
bash-3.2$ mv original.txt originals/
bash-3.2$ cat originals/original.txt 
weird
bash-3.2$ mkdir copies
bash-3.2$ ln -s originals/original.txt copies/copy.txt
bash-3.2$ cat copies/copy.txt 
cat: copies/copy.txt: No such file or directory
bash-3.2$ ls copies/copy.txt 
copies/copy.txt
bash-3.2$ ls -l copies/copy.txt 
lrwxr-xr-x  1 zach  staff  22 Dec 22 01:23 copies/copy.txt -> originals/original.txt
bash-3.2$ cat originals/original.txt 
weird
bash-3.2$ cat copies/copy.txt 
cat: copies/copy.txt: No such file or directory
bash-3.2$ cd copies/
bash-3.2$ cat copy.txt 
cat: copy.txt: No such file or directory

为什么我不能 cat 复制目录中的符号链接?

如果我从副本/内部创建符号链接,我可以很好地捕获它。如果我在当前目录中创建符号链接,我也可以 cat 它就好了。如果我在当前目录中创建符号链接,然后将其移动到副本/,我会得到“副本/copy.txt:没有这样的文件或目录”。

【问题讨论】:

    标签: bash symlink


    【解决方案1】:

    如果您创建符号链接的相对路径,它会将其存储为相对符号链接。符号链接与链接所在的位置有关,而不是与创建或打开链接的位置有关。


    请使用绝对路径或相对于链接的路径。

    变化:

    ln -s originals/original.txt copies/copy.txt
    

    收件人:

    # absolute
    ln -s /path/to/originals/original.txt copies/copy.txt
    
    # relative
    cd copies
    ln -s ../originals/original.txt copy.txt
    

    【讨论】:

    • 您不需要使用绝对路径。只要您在路径前加上一个点(这意味着“您当前的目录路径”),您就应该很好。
    【解决方案2】:

    您也可以使用相对路径来实现这一点。 喜欢

    cd copies
    ln -s ../originals/original.txt copy.txt
    

    这会起作用

    当您打开它尝试从副本目录引用文件的符号链接时,由于该文件不存在,您会收到该错误。

    当你使用相对或绝对路径时,这个问题就会得到解决。

    【讨论】:

    • 在编写生成符号链接的脚本时,有没有办法指定应该从哪个目录生成相对路径?
    • 使用脚本,您应该使用绝对路径。有一个固定目录来包含符号链接,然后创建与目录中任何文件相关的链接
    • 所有相对符号链接都相对于链接所在的目录。创建链接时不需要指向现有文件(如您所见)。相对链接或绝对链接的选择不应该在制作链接时做出,但无论您想要相对链接还是绝对链接。请记住,在创建后移动相对链接会更改它指向的文件的绝对路径。请参阅此处进行转换:stackoverflow.com/questions/2564634/…
    • 这应该是首选答案。一方面,如果您使用的是 git,那么绝对路径将不起作用。在路径前加上点“.”的技巧,意思是“你当前的位置”或双点“..”,意思是“一个目录向上。
    【解决方案3】:

    考虑一个示例,您希望将应用程序日志符号链接到其他位置,该目录可能是挂载到辅助目录的目录,其大小不会影响服务器停止工作。现在挂载的目录将成为您的目标,您应该为您的日志目录创建一个指向该目录的符号链接。

    假设您的应用程序目录是 /home/ubuntu/my_app,一旦您启动应用程序,它将在您的 my_app 目录中生成一个日志目录。现在的最终目标是将磁盘使用负担转移到挂载的目录,并且目前我们的应用目录中没有我们的日志目录。因此,请继续按照以下步骤操作:

    mkdir /path_to_mounted_directory/log
    ln -s /path_to_mounted_directory/log /home/ubuntu/my_app_log
    

    这将首先在挂载部分创建一个名为 log 的目录,并将您的应用程序日志映射到该目录。您在应用程序日志文件夹中添加的任何文件都将自动链接到挂载目录,因此您可以从原始日志目录或挂载文件夹中读取这些文件。

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2019-03-31
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 2011-06-09
      • 1970-01-01
      • 2017-04-08
      相关资源
      最近更新 更多