Linux "cp"は、ターゲットファイルの代わりにシンボリックリンクをコピーします。

Linux "cp"は、ターゲットファイルの代わりにシンボリックリンクをコピーします。

私のディレクトリには、テキストファイルとテキストファイルを指すシンボリックリンクという2つのファイルがあります。

base_v21.txt -> base_v001.txt
base_v001.txt

base_v001.txt次のコマンドを使用してコピーしようとすると:

# cp base_v001.txt /targetdir

base_v001.txtコピーされたのではなく複製されbase_v21.txtました。

# ls /targetdir
base_v21.txt

そのため、コピーするファイルをフルファイル名で指定してもシンボリックリンクがコピーされます。

-Lシンボリックリンクを使用したり逆参照したりするための投稿を見たことがありますが、-Hシンボリックリンクではなくターゲットファイル自体をコピーしようとしているので、私の場合は実際には適用されません。

シンボリックリンクとターゲットファイルが同じディレクトリにある理由については、私は制御できません。

答え1

この試み、

目的地を見てみましょう/tmp/

代わりにターゲットファイルをコピーするには、次の手順を実行しますsymlink

readlink -ne base.txt | xargs -0 cp -t /tmp/

答え2

シンボリックリンクのターゲットを取得する最も簡単な方法は、次の-Lオプションを使用することです。

-L, --dereference は常に SOURCE のシンボリックリンクに従います。

このコマンドは目標を達成します。

cp -L base_v001.txt /targetdir

答え3

新しいファイル名が指定されていない場合、ディレクトリにコピーすると、ソースファイルと同じ名前の新しいファイルがターゲットディレクトリに作成されます。したがって、次のコマンドは同じ出力を提供します。

> cp base_v21.txt /targetdir
> cp base_v21.txt /targetdir/base_v21.txt

ファイルの内容を含む "base_v21.txt"という名前の新しいファイルをソースディレクトリに作成します。この場合、シンボリックリンクにより「base_v001.txt」の内容になります。デフォルトでは、次の操作を行います。

> cat base_v21.txt >> /targetdir/base_v21.txt

したがって、コピー後に次のコマンドが同じ結果を提供すると予想できます。

> cat base_v21.txt
> cat base_v001.txt
> cat /targetdir/base_v21.txt

次の例では、ハードリンクまたはシンボリックリンクでこのようなことが発生していることがわかります。

> touch base_v001.txt
> ln -s base_v001.txt base_v21.txt #create soft link
> cat "test" >> base_v001.txt
> mkdir dir
> cd dir
> cp ../base_v21.txt .
> ls
base_v21.txt

>cat base_v21.txt
test

> ln base_v001.txt base_v21.txt #create hard link
> cat "test" >> base_v001.txt
> mkdir dir
> cd dir
> cp ../base_v21.txt .
> ls
base_v21.txt

>cat base_v21.txt
test

答え4

実際、これは非常に奇妙な行動です。

コマンドの別名に矛盾するパラメーターがあることを確認してくださいcp。これを行うには、次を実行します。type注文する。 (つまりtype cp

これに加えて、次の代替ユーティリティを使用して作業を実行できます。rsyncまた、シンボリックリンク処理もサポートしています(パラメータの使用--links --copy-links--hard-links

関連情報