既存のファイルを2つリンクする

既存のファイルを2つリンクする

2 つの既存のファイルがあります:abcdおよびxyz

$ cat abcd
abcd 
$ cat xyz
xyz

これらのファイルをソフトリンクしようとすると、次のメッセージが表示されます。

ln: cannot create xyz: File exists

使いたくない

ln -sf abcd xyz

xyzコマンドを使用すると、内容が内容で上書きされるためですabcd

私が望むのは、リンクが解除されたら、abcdすべての元のコンテンツを表示する必要があるということです。xyz

つまり、一時的に2つのファイルをリンクしたいのです。

ソフト/ハードリンク(例:インストールなど)以外に他のソリューションがあるかどうかを提案してください。

編集:、、、などSolaris OSのコマンドを手動で入力せずに使用しています。mount --bindmount -Bbindfsfusermount

また:を試してみましたmount -o bind abcd xyzが、次のメッセージが表示されましたcannot open /etc/vfstab。確認してみると、私だけがアクセスできることが確認/etc/vfstabされたRoot

答え1

lnこれは私たちがしなければならないことではありません。ln既存のファイルへのハードリンクを作成します。つまり、ディスク上の同じファイルを指す複数のディレクトリエントリを作成します。リンクされたファイルがどのように機能するかは、1つのファイルを編集するとすべてのファイルに影響を与えることです。

必要な機能はUnix固有の機能ではありません(後でリンクを解除するためにファイルを1つとして表示するように接続)。 Linuxただし、バインドマウントと呼ばれる機能は(数年前)に実装され、あるファイルまたはディレクトリを別のファイルまたはディレクトリ(ファイルの上のファイル、ディレクトリの上のディレクトリ)をマウントできます。

提案されたソリューション:あるファイルが一時的に別のファイルになるようにするには、バインドマウント(mount -B file1 file2)を使用します。このファイルfile1はにインストールされますfile2。後で削除すると、これら2つのファイルが元のものと同じように再表示されます。

# echo A >A

# echo B >B

# mount -B A B

# cat A
A

# cat B
A

# umount B

# cat A
A

# cat B
B

「リンクされた」ファイルを2つのファイルの関連付けとして表示するには、3番目のファイルを作成して後で削除する必要があります。

答え2

このコマンドは次のとおりです。

ln -sf abcd xyz

あなたが思うようにxyzコンテンツとして扱われないコンテンツabcd。シンボリックリンクはファイルではないため、内容はありません。

xyzコンテンツを失うことなく一時的にリンクするには、abcdコンテンツを何とか保存する必要があります。

  • 内容を一時ファイルにコピーできます。これは説明が必要ないと思います。
  • メモリを使用することもできます。つまり、コンテンツを変数に保存することもできます。
  • ハードリンクを使用できます。

さて、最後のものをお見せしましょう。あなたの質問に記載されているとおりabcdですxyz

  1. ハードリンクは目的の場所にコンテンツをxyz保持します。zyxzyxxyz

    $ ln xyz zyx
    

    現在、xyz2zyxつのハードリンクがあります。インデックスノードxyzあなたの質問に記載されているデータが含まれています。以下で確認できます。

    $ cat zyx
    xyz
    
  2. これzyxで準備ができたので、強制的xyzに再接続できますabcd

    $ ln -sf abcd xyz
    

    zyxそれでも文字を保持していますxyz。以下で確認できます。

    $ cat zyx
    xyz
    

    これでxyzソフト​​リンクされていますabcd。確認するには、次のコマンドを実行してください。

    $ cat xyz
    abcd
    
  3. 起動状態を復元するには、xyz元のコンテンツに再接続してください。つまり、元のinodeに再接続します。

    $ ln -f zyx xyz
    

    動作していることを確認するには、次の手順を実行します。

    $ cat xyz
    xyz
    

    これで、以下を使用してハードリンクを切断できますzyx

    $ rm zyx
    

    または今後の作業のために保管してください。どちらにしても、xyz最初に行った操作はまだ含まれています。

    $ rm zyx
    $ cat xyz
    xyz
    

答え3

接続が解除されると、abcdとxyzの両方が元のコンテンツを表示する必要があります。

もしそうなら、あなたが望むものはリンクではありません。両方のファイルがリンクされている場合、内容は同じです。より正確には、2つのディレクトリエントリが同じファイルを指している場合はリンクされます。ファイルのリンクを解除しても、2つのファイルは残りません。ディレクトリエントリのリンクを解除するとは、ディレクトリエントリを削除することを意味します(ファイルを削除するシステムコールとも呼ばれますunlink)。

他のファイルにファイルを隠す汎用機能はありません。あなたはそれを使用することができますファイルシステムバインディングファイルシステムは、ディレクトリを他のディレクトリとシャドウマッピングします。xyzディレクトリをディレクトリにシャドウマッピングするには、abcd次の手順を実行します。

bindfs -n -o nonempty xyz abcd

その後、以前のコンテンツはabcd非表示になり、abcd任意の方法でアクセスできますxyz。 Bindfsはヒューズファイルシステムの作成バインドマウント。シャドウを元に戻して元のコンテンツを表示するには、abcdファイルシステムをアンマウントします。

fusermount -u abcd

ファイルシステムをマウントしても、ディスクに保存されている内容は変わりません。シャドウはコンピュータに制限され、次回再起動するまで持続します。シャドウを維持するには、起動時にインストールされたリスト(/etc/fstab)にこのインストールを追加する必要があります。ただし、シャドウを維持するには、インストールするのが正しい方法ではない可能性があります。ファイルを移動してシンボリックリンクを作成するだけです。

mv abcd abcd.orig
ln -s xyz abcd

戻るには、シンボリックリンクを削除して元のファイルに戻ります。

rm abcd
mv abcd.orig abcd

答え4

私が理解したのは、両方のファイルをリンクしたいのですが、両方のファイルのデータが失われたくないようです。投稿にSolarisというタグを付けたので、このオペレーティングシステムを使用するとします。したがって、他のオペレーティングシステムの機能を参照することは無意味に見えます。この回答では、データに 1 つ以上の zfs データセットを使用すると仮定します。

ファイルシステムのzfsスナップショットを作成し、ファイルの代わりにリンクを挿入し、ln -sf abcd xyzを作成し、必要な操作を実行した後にロールバックできます。

root@solaris:/rpool# zfs create rpool/filesystem1
root@solaris:/rpool# mkfile 1k /rpool/filesystem1/file1
root@solaris:/rpool# mkfile 1k /rpool/filesystem1/file2
root@solaris:/rpool# ls -l /rpool/filesystem1
total 2
-rw-------   1 root     root        1024 Jun  8 20:33 file1 .  
-rw-------   1 root     root        1024 Jun  8 20:33 file2
root@solaris:/rpool# zfs snapshot rpool/filesystem1@withtwofiles
root@solaris:/rpool# rm /rpool/filesystem1/file2
root@solaris:/rpool# ln -s /rpool/filesystem1/file1 /rpool/filesystem1/file1
root@solaris:/rpool# ls -l /rpool/filesystem1
total 4
-rw-------   1 root     root        1024 Jun  8 20:33 file1
lrwxrwxrwx   1 root     root          24 Jun  8 20:33 file2 -> /rpool/filesystem1/file1
root@solaris:/rpool# zfs rollback rpool/filesystem1@withtwofiles
root@solaris:/rpool# ls -l /rpool/filesystem1
total 6
-rw-------   1 root     root        1024 Jun  8 20:33 file1
-rw-------   1 root     root        1024 Jun  8 20:33 file2
root@solaris:/rpool# 

リンクを解除する代わりに、リンクを使用してファイルシステムを簡単にロールバックできます。

関連情報