これらの権限を持つシンボリックリンクがあります:
lrwxrwxrwx 1 myuser myuser 38 Aug 18 00:36 npm -> ../lib/node_modules/npm/bin/npm-cli.js*
シンボリックリンクは.tar.gzアーカイブにあります。ここで、mavenを使用してtar.gzアーカイブを解凍すると、symlinkは無効になります。したがって、私はシンボリックリンクを再構築しようとしています。最初にlnを使用してシンボリックリンクを作成しますが、元のシンボリックリンクと同じ権限をどのように設定しますか?
新しいシンボリックリンクを作成し、それを古いリンクの場所に移動できます。
ln -s <new_location> npm2
mv -f npm2 npm
これにより、リンクの所有権が保持されます。または、chown
を使用して、リンクの所有権を手動で設定できます。
chown -h myuser:myuser npm
ほとんどのシステムでは、シンボリックリンクの権限は重要ではありません。シンボリックリンクを使用する場合、シンボリックリンクのターゲットのコンポーネントの権限がチェックされます。ただし、一部のシステムでは問題になります。 MacOSはreadlink
のリンクに対する読み取り権限を必要とし、NetBSDのsymperm
マウントオプションは読み取りと全探索のリンク権限チェックを強制します。それらのシステム(およびFreeBSDやOpenBSDを含むそれらの親戚)には、chmod
と同等の-h
オプションがあります。
chmod -h 777 npm
chmod
を使用してリンクの権限を設定しようとする場合、実際に行うのはリンクのターゲットの権限を設定することです。リンクの権限は無意味です。
次のようなリンクがある場合:
link -> foo/bar
そしてそれを次のように変更したい:
link -> new/target
考慮すべき2つのケースがあります。
foo/bar
はディレクトリではないか、存在しないか、foo
への検索アクセス権がありません。その後
ln -s new/target link
link
はすでに存在するため失敗しますが、標準を使用することでそれを克服できます。
ln -fs new/target link
foo/bar
はディレクトリです(そして、foo/bar
がディレクトリであることを確認するには、foo
に対する検索権限があります)。その場合、次のことを行います。
ln -s new/target link
または
ln -fs new/target link
これは、target
ディレクトリ内に新しいlink
シンボリックリンクを作成すると理解されます(link
は、foo/bar
ディレクトリへのシンボリックリンクであるため、ディレクトリです)。だからあなたは実際に作成します:
foo/bar/target -> new/target
これを克服するために、GNU ln
には、リンク名を常にリンク名と見なすための-T
オプションがあり、リンクを作成するためのディレクトリではありません( s)in。したがって、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など)では、通常、それらを変更する方法があります(OS/Xではchmod -h
)。
所有権は、上記のように、ほとんどのシステムのシンボリックリンクが指すファイルへのアクセスには関係ありませんが、 親ディレクトリのt
ビットに関連する他の関連性がある場合があります)... =)そしてそれを変更する標準コマンドがあります:
chown -h user[:group] the-link
chgrp -h group the-link
シンボリックリンクの権限を変更する必要がある場合(他の回答に記載されているように、通常は無意味です)、chown
の-R
オプションを使用して成功しました:
chown -R myuser:mygroup link
-R
が使用されなかった場合、権限は変更されませんでした。