mvユーティリティに-R(再帰)オプションは必要ありませんが、cpに必要な理由は何ですか?

mvユーティリティに-R(再帰)オプションは必要ありませんが、cpに必要な理由は何ですか?

cp私はorを使うときはいつも混乱していますmv: " -Rdirを使うときにオプションが必要ですか?" GNU coreutilsではcp実際に必要です-Rが必要ありませんmv

ディレクトリコピーオプションがcp必須で必須ではない理由が見つかりません。私はdirsなしで(しかしThere'sとlikeのように再帰的に動作します)、誰かがそのツールを使う習慣を破る以外に他の問題を引き起こすとは思いません。-Rmvcp-R-Rmv

あなたは説明を知っていますか?昔から理由があったでしょうか?


追加の質問:cpcoreutils開発者がデフォルトでディレクトリを繰り返しコピーしないのはなぜですか?

答え1

ディレクトリは、(概念的に)名前のリストとその名前が指すアノード番号を含む特別な「ファイル」です。一部の名前はサブディレクトリにすることができます。..親ディレクトリを指す特別なエントリがあります。

したがって、ファイル名を変更するのは簡単であることは明らかです。ディレクトリエントリの名前を変更するだけです。ファイルが実際にファイルなのか、それとも別のディレクトリの内容を保存するために使用される「ファイル」なのかを保存します。実際、同じrenameシステムコールで両方の操作を実行できます。

しかし、コピーはそれほど簡単ではありません。あなたできる"files"ディレクトリをコピーすると、同じファイルを含む2つのディレクトリが作成されます(ハードリンク)。ディレクトリハードリンクを許可するシステムがある場合は、はい。ただし、最新のシステムではこれを許可しないため、少なくともルートではない場合は、各サブディレクトリに対応するコピーを作成する必要があります。実際、ハードリンク、再帰の場合:をcp使用してこの動作を要求できます。cp -lR-l-R

しかし、すべてを接続したままにしておくことは望むものではないかもしれません。代わりに、cpすべてのファイルをコピーしようとしています。これはかなり高価な作業です。各ファイルをメモリに読み込み、ディスクの2番目の場所に書き換える必要があります。ファイルを開いたり、読んだり、書き込んだり、閉じたりするには、実際には複数のシステムコールが必要です。

既存のファイルシステムもディスク上でこのように動作します。各ファイルを個別に確認してコピーする以外に、複数のファイルをコピーする方法はありません。これは、デフォルトのコマンドラインユーティリティで使用するように設計されたファイルシステムの種類です。

答え2

まず、別の質問をさせていただきます。

cpこれらとそしての違いは何ですかcp -R

さて、対応するフラグがなければ、-Rファイルだけをコピーできます。誰かがディレクトリを非再帰的にコピーしたい場合は非常にまれです。非再帰コピーはディレクトリの2番目の名前を生成し、同じディレクトリを直接指します。構造。これは望むことがほとんどなく、実際にこれを行う別のプログラム()があるため、ディレクトリの非再帰的なlnコピーは許可されていません。

mvでは、との違いは何ですかmv -R

mv a bディレクトリ内の単一項目の名前を変更すると、ディレクトリがmv編集されるとその内容も自動的に移動されます。この意味でmv再帰属性が提供された。つまり、「名前の変更」はディレクトリ内のすべてのエントリの名前を変更します(例:fromからa/1b/1mvこれを行わないA、つまりディレクトリ名をaに変更してbそのままにしておくa/1ことは、a/1人々が何か移動を言及するときに理解するものではありません。キャビネットを移動すると、キャビネットの内容も移動します。内容が含まれていないディレクトリを移動するもう1つの操作もすでに利用可能であり、それを呼び出しますmkdir

答え3

一般的に、私はUnixロジックを台無しにしたときにPlan9を見て、Unixの発明者が何年も前のバージョンとの互換性を主張せずに同じことをどのように達成したかを確認します。

したがって、Plan9はファイルでのみ機能するツールを提供しますcpmv

`cp f1 f2` creates f2 and copies f1's contents into it.
`mv f1 f2` renames f1 to f2 if f1 and f2 are in the same dir
           does `cp f1 f2 && rm f1` else
           can rename dirs (`mv d1 d2`) but will not move dir to another dir.

これは実際にはディレクトリコピーdircp@{cd fromdir && tar c .} | @{cd todir && tar xT}rcシェル構文)に当てはまります。

ディレクトリを移動するには、次のものがあると思います。dircp d1 d2 && rm -r d1

cpこれらの制限とmv(ディレクトリではなく)ファイル操作にのみ使用する決定は、ディスク操作をより明確にし、tarファイルツリーのコピーを理解し、スクリプトするのが非常に快適になると思います。

関連情報