回答:
新しいシンボリックリンクを作成して、古いリンクの場所に移動できます。
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 -hOS / 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オプションを使用することです。受け入れられた回答を更新しましたが、これは間違っていました。