回答:
新しいシンボリックリンクを作成して、古いリンクの場所に移動できます。
ln -s <new_location> npm2
mv -f npm2 npm
これにより、リンクの所有権が保持されます。または、chown
リンクの所有権を手動で設定するために使用できます。
chown -h myuser:myuser npm
ほとんどのシステムでは、シンボリックリンクのアクセス権は重要ではありません。シンボリックリンクを使用すると、シンボリックリンクのターゲットのコンポーネントの権限がチェックされます。ただし、一部のシステムでは重要です。MacOSはのリンクの読み取り許可を必要readlink
とし、NetBSDのsymperm
マウントオプションは読み取りとトラバーサルのリンク許可チェックを強制します。それらのシステム(およびFreeBSDやOpenBSDを含むそれらの関連システム)には、に同等の-h
オプションがありchmod
ます。
chmod -h 777 npm
chmod
リンクの許可を設定するために使用しようとすると、実際に行うのは、リンクのターゲットの許可を設定することです。リンクの許可は無意味です。
test
持つ-rw-rw-r-- root root
ために、rm test
私はプロンプトを受け取るrm: remove write-protected regular empty file 'test'?
ソリューションは、ユーザがアクセスのみを読んでいるいるディレクトリ内の機密ファイルを配置することです。
次のようなリンクがある場合:
link -> foo/bar
に変更したい:
link -> new/target
考慮すべき2つのケースがあります。
foo/bar
はディレクトリではないか、存在しないか、に検索アクセスできませんfoo
。それから
ln -s new/target link
link
既に存在するため失敗しますが、標準を使用することでそれを克服できます:
ln -fs new/target link
foo/bar
はディレクトリです(そして、それがディレクトリであるfoo
かどうかを判断できる検索許可を持っていますfoo/bar
)。その場合、次のことを行います。
ln -s new/target link
または
ln -fs new/target link
これは、ディレクトリtarget
内に新しいシンボリックリンクを作成するものとして理解されますlink
(link
ディレクトリへのシンボリックリンクであるため、foo/bar
ディレクトリです)。したがって、実際に作成します:
foo/bar/target -> new/target
それを克服するために、GNUがln
あり-T
。常にGNUで、リンク名としてではなく、そうでリンクを作成するためのディレクトリとみなすことへのリンク名のオプションをln
:
ln -fsT new/target link
働くでしょう。以前と同様に、元のlink
シンボリックリンクを削除new/target
し、ターゲットとして(およびプロセスのeuidとegidを所有者として)新たに作成します。
GNU ln
には-n
オプションもあります。-T
いつlink
実際に実際のディレクトリであるかを除いて動作しますが、その場合、エラーで失敗する代わりに、そのディレクトリ内にシンボリックリンクが作成されます。
移植性の高い方法としては、最初にリンクを削除してから再作成するのが最善の方法です。
rm -f link && ln -s new/target link
ほとんどのシステムでは、シンボリックリンクの許可は無視され、通常はに固定されていrwxrwxrwx
ます。
シンボリックリンクのアクセス許可が重要なシステム(OS / Xのように、ターゲットを解決するためにシンボリックリンクの読み取り許可が必要な場合)では、一般にそれらを変更する方法があります(chmod -h
OS / Xの場合)。
所有権は、上記のように、ほとんどのシステムでシンボリックリンクが指すファイルへのアクセスには関係ありませんが、親ディレクトリまたはクォータのビットに対して他の関連性を持つことができますt
...)、それを変更する標準コマンドがあります:
chown -h user[:group] the-link
chgrp -h group the-link
シンボリックリンクの許可を変更する必要がある場合(他の回答に書かれているように、通常は意味がありません)、-R
オプションの使用に成功しましたchown
:
chown -R myuser:mygroup link
-R
使用されなかった場合、権限は変更されませんでした。
chown
ことは-R
暗黙に示されて-P
いるため動作しますが、それは保証されておらず、他のいくつかの実装では動作しません。シンボリックリンクの所有権を変更する標準的な方法は、-h
オプションを使用することです。受け入れられた回答を更新しましたが、これは間違っていました。