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番目の場所に書き換える必要があります。ファイルを開いたり、読んだり、書き込んだり、閉じたりするには、実際には複数のシステムコールが必要です。

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

おすすめ記事