cp、末尾のスラッシュ、同じディレクトリにコピー、または別のディレクトリにコピー

cp、末尾のスラッシュ、同じディレクトリにコピー、または別のディレクトリにコピー

あるディレクトリを別のディレクトリにコピーするには、最初のディレクトリにスラッシュがあってはなりません。

# example 1
# this command will copy dir1 to dir2
# (dir2 is preexisting)
cp -Rip dir1 dir2/

それ以外の場合、コマンドはディレクトリ自体ではなくディレクトリの内容をコピーします。

# example 2
# this command will copy dir1 contents to dir2
# (dir2 is preexisting)
cp -Rip dir1/ dir2/

dir1私とhereの違いを理解していますがdir1/、これら2つのコマンドがどのように機能するのかという違いは私を混乱させません。

ただし、他のディレクトリではなく現在存在するのと同じディレクトリにディレクトリをコピーする場合は、次のスラッシュに違いはありません。なぜ?

# example 3
# any of these commands will make a dir1 copy
# (dir1-copy isn't preexisting)
cp -Rip dir1 dir1-copy/
cp -Rip dir1/ dir1-copy/

密接に関連する別の問題があります。 Howmv dir1/ dir2/mv dir1 dir2/Workの間に違いがないのはなぜですか?つまり、ソースディレクトリの末尾にある末尾のスラッシュがmv例3のロジックに従いますが、cp例1と2のロジックに従わないのはなぜですか?

macOS 14.3.1、zsh 5.9(x86_64-apple-darwin23.0)

答え1

cp -R dir1 dir2との動作の違いはcp -R dir1/ dir2FreeBSDに追加された機能です。バージョン 5.4。少なくとも当時のマニュアルには、-Rオプションを説明するために次の文が追加されました。

/で終わると、source_fileディレクトリ自体ではなくディレクトリの内容がコピーされます。

この動作はより古い可能性があり、5.4は文書の空白を埋めるだけです。そのような内容はありません。5.05.15.25.3または5.4リリースノート。まだソースダイビングをしたことがありません。

FreeBSDコマンドラインユーティリティを含む最新バージョンのFreeBSDとmacOSはこの動作を維持します。他のシステム(GNU、BusyBox、OpenBSD、NetBSD、またはすべてのPOSIX互換システム)にはこの動作はなく、まったく同じ動作を持ちます(シンボリックリンクでない限りcp -R dir1/ dir2:リンクをたどる)。cp -R dir1 dir2dir1dir1/

FreeBSDの動作は、同じ区別を持つrsyncに触発されている可能性があります。私は彼らが以前のバージョンと互換性のない変更を加えたのは奇妙だと思います。

ただし、他のディレクトリではなく現在存在するのと同じディレクトリにディレクトリをコピーする場合は、次のスラッシュに違いはありません。なぜ?

これは奇妙なデザイン決定です。あるいは、デザイン決定ではなく、実装のバグ(ソースパスを解析し、末尾のスラッシュの後ろの部分がパスコンポーネントであることを確認)である可能性があり、関数を呼び出すことにしました。 rsync を使用すると、ターゲットディレクトリが存在しない場合でも、末尾のスラッシュはその動作を維持します。

mv dir1/ dir2/mv dir1 dir2/HowとWorkの間に違いがないのはなぜですか?

(シンボリックリンクではないと仮定すると)何の違いもあってはいけないので、dir1これは正常です。

関連情報