0

场景:我正在编写一个检查目录是否存在的 shell 脚本;如果是这样,并且它是一个符号链接,它会重命名目录.bak并附加到目录名称。然而,我注意到,如果我将一个符号链接目录(目录 A)移动到另一个符号链接目录(B),它会导致 A 被移动B 内部,而不是覆盖 B。

为了显示:

$ mkdir foo                                                                     
$ mkdir bar                                                                     
$ ln -s "$PWD/foo" ~/.baz                                                       
$ ls -al ~/.baz                                                                 
lrwxr-xr-x  1 ysim  staff  15 Sep 11 21:45 /Users/ysim/.baz -> /Users/ysim/foo  
$ mv ~/.baz ~/.bam                                                              
$ ls -al ~/.bam                                                                 
lrwxr-xr-x  1 ysim  staff  15 Sep 11 21:45 /Users/ysim/.bam -> /Users/ysim/foo  
$ ls -al ~/.baz                                                                 
ls: /Users/ysim/.baz: No such file or directory                                                                                                   
$ ln -s "$PWD/bar" ~/.baz                                                       
$ ls -al ~/.baz                                                                 
lrwxr-xr-x  1 ysim  staff  15 Sep 11 21:47 /Users/ysim/.baz -> /Users/ysim/bar  
$ ls -al ~/.bam                                                                 
lrwxr-xr-x  1 ysim  staff  15 Sep 11 21:45 /Users/ysim/.bam -> /Users/ysim/foo  

现在,当我重命名/移动~/.baz~/.bam

$ mv ~/.baz ~/.bam                 

~/.baz( )的目标/Users/ysim/bar不会~/.bam像预期的那样移动到 的目标:

$ ls -al ~/.bam                                                                 
lrwxr-xr-x  1 ysim  staff  15 Sep 11 21:45 /Users/ysim/.bam -> /Users/ysim/foo 

相反,整个~/.baz符号链接已移动~/.bam目录中:

$ ls -al ~/.bam/
total 8
drwxr-xr-x   3 ysim  staff   102 Sep 11 21:47 .
drwxr-xr-x+ 96 ysim  staff  3264 Sep 11 21:51 ..
lrwxr-xr-x   1 ysim  staff    15 Sep 11 21:47 .baz -> /Users/ysim/bar

这是为什么?我该如何去做我打算做的事情,即将目标写入目标~/.baz目标~/.bam,这样~/.bam就有了目的地/Users/ysim/bar

4

1 回答 1

1

它的工作原理是这样的,因为mv要求操作系统进行移动,并且操作系统取消引用符号链接。要表现不同mv,需要额外的代码来检查符号链接和一些--dereference-target, --dereference-src(或此类)选项。想想不同用户可能认为需要的不同行为的数量。

你需要

rm "$dest"
cp -a "$src" "$dest"
# in your case src=".bam" and dest=".baz"

顺便说一句,如果你想在脚本中

  • “读取”脚本中符号链接的目标:target=$(readlink "$f")
  • 测试文件是否是符号链接:test -l "$f"
于 2013-09-12T05:26:48.460 回答