web-dev-qa-db-ja.com

CygwinのネイティブNTFSシンボリックリンクを有効にする

最近のNTFSとWindowsはシンボリックリンクを実装しています。

  • NTFSジャンクションポイント は、linkdまたはjunctionツールを使用するNTFS 3.0(Windows 2000)以降、ディレクトリシンボリックリンクとして使用できます。
  • NTFSシンボリックリンク は、Windows Vistaがmklinkツールを使用しているため、(ファイルとディレクトリの両方の)シンボリックリンクとしても使用できます。

ただし、Cygwin 1.7(Windows 7にインストール)では、ln -sはテキストファイルを作成します。

cygwinの場合:

$ ln -s -v target mylink
`mylink' -> `target'

minGW(またはお気に入りのエディター):

$ cat mylink
!<symlink>ÿþt a r g e t 

Cygwingに NTFSジャンクションポイント または NTFSシンボリックリンクを使用するように指示することは可能ですか?

他の質問:これはMinGWで利用可能ですか?

48
olibre

受け入れられた答えは正しい、2つの小さなサイドノートです。

コマンドラインで自分で作成したシンボリックリンクだけを気にする場合は、_cygutils-extra_パッケージをインストールします。これにはwinlnコマンドが含まれます。これはlnと同じ構文ですが、ネイティブWindowsリンクを作成します。エイリアスを作成します:_alias ln=winln_(インタラクティブシェルでのみ動作します)、またはlnファイルをwinlnで置き換えます(シェルスクリプトでも動作します)-しかし、次回coreutilsパッケージが更新されると上書きされる可能性があります。

Cygwinを既にインストールしていて、自分でいくつかのシンボリックリンクを追加した場合にのみ、ネイティブシンボリックリンクを使用できることがわかりました。したがって、システム環境変数として_CYGWIN=winsymlinks:native_を設定した後、既存の非ネイティブリンクをすべてネイティブに変換したいと考えました。これが私がしたことです。

念のため、最初にCygwinディレクトリ全体をバックアップしてください。

すべてのシンボリックリンクを見つけて、リストを_/links_ファイルに保存します:cd /; find . -regextype egrep -regex './(dev|proc|mnt|cygdrive)' -Prune -o -type l -print >links

linksを確認します。すべてのリンクを使用してtarアーカイブを作成します:_tar c --files-from=links >links.tar_

tarアーカイブを抽出します。_tar x --files-from=links <links.tar_ネイティブシンボリックリンクが有効になったため、tarは古いCygwinのシンボリックリンクをネイティブシンボリックリンクで上書きします。

クリーンアップ:_rm -f links links.tar_

追伸最初は_CYGWIN=winsymlinks:nativestrict_を使用しましたが、このモードではtargetが存在しないと_ln -s target link_が失敗することがわかりました。対照的に、nativeは、存在しないlinkを指すCygwin(非ネイティブ)シンボリックリンクtargetを作成します。これは、UNIXシステムでのlnの動作と一致します。まれに、nativestrictが一部のプログラムまたはスクリプトを破損することがあります。たとえば、Gentoo _run-crons_スクリプトは、実行中のプロセスのPIDを指すシンボリックリンクであるロックファイルを使用します。 nativestrictモードでは、ロックファイルを作成できなくなったため、スクリプトは動作を停止しました。注:_run-crons_はGentoo Linuxのcrontabヘルパースクリプトであり、_cron.{hourly,daily,weekly,monthly}/_ dirsのサポートを追加し、Cygwinで非常にうまく機能します。

7
Gene Pavlovsky

@olibreの回答は私にとってはうまくいきませんでした。シェル関数を作成しました。

: '
mklink - Create NTFS (Windows) links that is usable by Windows and Cygwin

Usage: mklink [/D | /H | /J] <link-path> <target-path>

Options:
    /D    Directory Symbolic Link
    /H    Hardlink
    /J    Directory Junction (you should prefer /D)

With no options, it creates a NTFS file symlink.
'
mklink () {

    if [ "$#" -ge "3" ]; then
        cmd /c mklink "$1" "$(cygpath --windows --absolute "$2")" "$(cygpath --windows --absolute "$3")"
    else
        cmd /c mklink "$(cygpath --windows --absolute "$1")" "$(cygpath --windows --absolute "$2")"
    fi

}

上記を問題なく実行するには、管理者権限(Cygwin用)が必要であることに注意してください。

絶対パスへのシンボリックリンクとCMDのmklinkを使用した相対パスへのシンボリックリンクとの間に違いがあるかどうかはわからないことに注意してください。 Linuxでは、シンボリックリンクの移動、ターゲットファイルの移動、またはその両方の移動を決定した場合、これら2つの動作は異なります。

3
CMCDragonkai

一番簡単な方法は

  1. grant SeCreateSymbolicLinkPrivilege ローカルグループポリシーエディターから(gpedit.msc、デフォルトではパス上、非ホームバージョン)

  2. パスにlnという名前のスクリプト(バッチまたはバッシュ)を作成します。上記のシェル関数と同様の実装

  3. 利益

0
Agnes K. Cathex