「cp」が再帰的であると予想できない場合はいつですか?

「cp」が再帰的であると予想できない場合はいつですか?

cpどのような状況でディレクトリでこのコマンドを使用したいが、まだ利用できない場合はありますか?いいえ再帰的ですか?考慮する:

$ tree
.
└── old
    └── inner
        └── a.txt

2 directories, 1 file

$ cp old/inner/ .
cp: omitting directory `old/inner/'

$ tree
.
└── old
    └── inner
        └── a.txt

2 directories, 1 file

それはまさに何をしたのでしょうか?それでは、なぜこの-rフラグを使用しないのか、明示せずにこれを暗示するのはどうでしょうか?この-rフラグは通常のファイルには影響しません。

$ cp -r old/inner/a.txt .
$ ls
a.txt  old

別名を付けることができることを知っていますが、cp私のcp -r目標は何も修正するのではなく、原因が何であるかを理解することです。

答え1

私はしばしばディレクトリにファイルをコピーしたいのですが、なぜこれは奇妙に見えますか?それはあなたがしたいことに依存します。たとえば、プログラムを実行するためにこれらのファイルが必要であると仮定して、プロジェクトで使用されているすべてのファイルをディレクトリに保存することがあります。また、以前のバージョンやデータファイルなどを含むさまざまなサブディレクトリがあります。プログラムを実行するためにサーバーに転送するには、次のものが必要です。文書サブディレクトリではないので、cpデフォルトは正確に必要です。

時々する簡単な事実を除いていいえ再帰的にコピーするには、通常、ほとんどすべてのプログラムで再帰を明示的に有効にする必要があります。これは標準であり、ユーザーがプログラムを初めて使用するときに期待できるものです。したがって、再帰をデフォルト値に設定するのは良い考えではありません。再帰のためのフラグを追加する必要があるのは-r予想される動作です。通常、基本的に再帰したくありません(考えるかchmod待っgrepてくださいls)。

答え2

ディレクトリを繰り返しコピーすると、多数のファイルを上書きする可能性があります。 1つのコマンドを誤って実行すると、多くのダメージを与える可能性があります。デフォルトは非再帰的であるため、あるディレクトリを別のディレクトリにコピーするたびに明示的に実行されるため、理論的には実行前に入力が考慮されます。

これは最良の例ではありませんが、両方のターゲットがディレクトリであることに気づかずに、次のコマンドを誤って入力した場合はどうなるか想像してください。

cp /bin /usr # /usr/bin already exists and has important stuff in it

編集1:1つの解決策は、明示的なフラグを追加するのではなく、ユーザーに対話的にメッセージを表示し、「続行しますか?」と尋ねることです。しかし、これは「インタラクティブ入力に固執しないでください」[McIlroy78]というUNIXの哲学と完全には一致しません。cpは、時間が経つにつれていくつかの重要な変化を経験した古いUNIXプログラムですが、これらの系譜は依然として設計のさまざまな面で見ることができます。

編集2:私はいくつかの他の良い理由を見つけました。おそらくそれ以上です。 StackExchangeで1つを見つけることができます。

  1. シェルスクリプトでの使用により、コマンドラインオプションとプログラムのデフォルトの動作は古くて一般的であるため、変更がcp困難です。一部のスクリプトはこの動作に依存する可能性があります(ディレクトリコピーの拒否)。多くのシェルスクリプトでは、インタラクティブなプロンプトは望むものではありません。

  2. ファイルコピーとディレクトリコピーは基本的に2つの異なる作業であり、これを処理するには概念的に別々のコマンドまたはオプションが必要です。unix mvプログラムはディレクトリに-R(再帰)オプションを必要としませんが、cpに必要な理由は何ですか?

[McIlroy78] ベルシステム技術ジャーナル。ベル研究所。マキロイMD、EN PinsonおよびBA Tague。 「Unixタイムシェアリングシステムの開発」。 1978. 57(6、2部)。血。 1902.

関連情報