*nix では、シンボリック リンクは通常、「シンボリック リンク」属性を持つプレーン テキスト ファイルです。このファイルには、リンク ターゲットへのパスが含まれています。 「symlink」属性は Windows には存在しません。そのため、Windows でシンボリック リンクを抽出すると、通常のテキスト ファイルになります [エラーになることもありますが、アーカイブの抽出に使用するツールに依存する場合があります]。 *nix にコピーして戻すと、通常のテキスト ファイルのままになります。
唯一の解決策は、外部メタデータ ストアに「symlink」属性を保持し、ファイルのアップロード時またはアーカイブの作成時に属性を復元することです。
ただし、これをサポートするツールは知りません。
これは間違いなくコーディングできます。
<オール>
WinSCP の使用 :WinSCP スクリプトを生成するコードを作成します。コードは、ローカル ディレクトリ構造を再帰的に繰り返します。ファイルの場合、put
が生成されます コマンドでアップロードします。シンボリックリンクの場合、ln
が生成されます コマンドでシンボリックリンクを作成します。シンボリック リンクを区別するには、単純なヒューリスティック (シンボリック リンク =スラッシュ付きの短い 1 行のテキスト ファイル) を使用できます。適切な方法は、アーカイブを抽出するときにファイルのシンボリック リンク属性を覚えておくことです (ただし、抽出も自分でコーディングする必要があります。以下のヒントも参照してください)。
アーカイブの使用 :最近、ZIP アーカイブ用にこれを実装しました。 (Windows でも) PHP メソッド ZipArchive::setExternalAttributes
を使用できます アーカイブされたファイルをシンボリックリンクとしてフラグ付けします。この関数は PHP 5.6 以降でのみ使用できることに注意してください。
サンプルコード:
$symlink = true; // is symlink?
$dir = false; // is folder?
$mode = "755"; // permissions
$local_path = "C:\\zip\\folder\\mylink";
$zip_path = "folder/mylink";
$attr =
(1 << 14) | // this bit seems to be always set
(1 << ($dir ? 30 : 31)) |
($symlink ? (1 << 29) : 0) |
octdec($mode) << 16;
$zip->addFile($local_path, $zip_path);
$zip->setExternalAttributesName($zip_path, ZipArchive::OPSYS_UNIX, $attr);
Python に精通している場合は、Python の zipfile モジュールを使用して ZIP ファイル内のファイルにアクセス許可 (属性) を設定するにはどうすればよいですか? を参照してください。パーミッションのみを扱いますが、私の PHP の例のように、symlink ビットで簡単に拡張できます。
リンク ファイルを gzip (または tar.gz) アーカイブ内に保持し、別の Linux システムでのみ展開するようにします。一般的に、Windows は Linux のファイル属性とパーミッションを適切に処理しないことを私は知っています。Windows でリンクを抽出すると、何らかの形で変更される可能性があります。
または、自動化されたスクリプトで、またはカスタムの ln
をコピーして貼り付けるだけで、新しい Linux システムでシンボリック リンクを簡単に再作成できるはずです。
#!/bin/bash
ln -s TARGET LINKNAME
これらはすべて、新しい Linux システムが元の Linux システムと同じ場所に同じターゲット ファイルを持っていることを前提としています。