0

シナリオ: ディレクトリが存在するかどうかを確認するシェル スクリプトを作成しています。存在し、それがシンボリックリンクである場合、ディレクトリ名に.bak追加してディレクトリの名前を変更します。ただし、シンボリックリンクされたディレクトリ (ディレクトリ A) を別のシンボリックリンクされたディレクトリ (B) に移動すると、B が上書きされるのではなく、A が 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

mvOSに移動を要求し、OSがシンボリックリンクを逆参照するため、そのように機能します。異なる動作を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 に答える