cpを使用してソフトリンクをハードリンクに変換する

cpを使用してソフトリンクをハードリンクに変換する

コマンドcpページには次のinfoオプションがあります。--preserve=

links
ターゲットファイルの対応するソースファイル間のリンクを保持します。気づく-H 'を使用すると、-L' orこのオプションはできるシンボリックリンクをハードリンクに変換

以下は、とにかく今は理解できない例です。

質問:ソフトリンクをハードリンクに変換するにはcp? [ハードリンクをソフトリンクに変換]方法はありますか?


マイナーな問題:どこできる上記の引用で役に立ちますか?私は-L目的を理解し、フル機能の-Hソフトリンクなどをコピーできますが、これまでソフトリンクをハードリンクに切り替えることはできませんでした。

ベストアンサー1

情報ページの例は、この例が少し難しいことを示しています。

$ mkdir c; : > a; ln -s a b; cp -aH a b c; ls -i1 c
74161745 a
74161745 b

これをコンポーネントコマンドに分類しましょう。

  • mkdir c;: ディレクトリの作成c/
  • : > a;:空のファイルを作成する簡単な方法です。は何もしない bash 組み込みと同じです。を参照echo "" > aしてください。:help :
  • ln -s a ba:通話できるソフトリンクを作成しますb。このとき、現在のディレクトリの内容は次のとおりです。

    $ ls -l | cc2ter 
    total 4
    -rw-r--r-- 1 terdon terdon    0 Oct  9 02:50 a
    lrwxrwxrwx 1 terdon terdon    1 Oct  9 02:50 b -> a
    drwxr-xr-x 2 terdon terdon 4096 Oct  9 02:50 c
    

    これはbシンボリックリンク(ソフトリンク)であり、次のものと同じinodeを指していませんa

    $ ls -i1c a b
    16647344 a
    16647362 b
    
  • cp -aH a b c;:ファイルをディレクトリaにコピーします。ここで変換が発生し、渡されるオプションは次のとおりです。bccp

    -a, --archive
          same as -dR --preserve=all
    -d    same as --no-dereference --preserve=links
    -H    follow command-line symbolic links in SOURCE
    

    これは-H以下の理由で必要ですinfo cp

    シンボリックリンクからコピーするとき、「cp」は通常、再帰なしでコピーするときにリンクだけに従います。

    -a再帰コピー(-R)が有効になっているため、シンボリック-Hリンクに従う必要があります。-Hこれは、再帰にもかかわらずリンクが追跡され続け、その結果、ターゲットディレクトリにハードリンクが確立されることを意味します。これはc/最後のステップの後に来るものです(最初の列はinode番号です)。

    $ ls -li c 
    total 0
    17044704 -rw-r--r-- 2 terdon terdon 0 Oct  9 02:50 a
    17044704 -rw-r--r-- 2 terdon terdon 0 Oct  9 02:50 b
    

これが正確にどのように機能するかについて、次の場合にシンボリックリンクをハードリンクとして使用、cp --preserve=links結合-L、または変換することで把握できます。-Hリンクと宛先の両方がコピーされます。同じ目次


実はOPとして発見する少なくとも Debian システムでは、cp --preserve=linksターゲットディレクトリが同じであれば、シンボリックリンクをハードリンクに変換するだけで十分です。

おすすめ記事