等しい方法でcpを使用してフォルダを再帰的にコピーするには?

等しい方法でcpを使用してフォルダを再帰的にコピーするには?

私が使うとき

cp -R inputFolder outputFolder

明らかにする状況によって異なる:

  1. outputFolder存在しない場合、複製されたフォルダパスはですoutputFolder
  2. 存在する場合、outputFolder生成されたクローンはoutputFolder/inputFolder

これは怖すぎる、いくつかのインストールスクリプトを作成したいので、ユーザーが誤って2回実行すると最初に生成され、2outputFolder回目の実行ではすべてが再生成されますoutputFolder/inputFolder

  • 私はいつも最初の動作をしたいです。つまり、元のオブジェクトの横にレプリカ(兄弟として)を作成します。
  • 私が使いたいのはポータブルです。 (たとえば、MINGWは出荷されcpません。)rsync
  • 確認しましたが、cp -R --parentsディレクトリツリーのパスが再生成されます(したがってレプリカはそうではありませんoutputFoldersome/path/outputFolder
  • --remove-destinationまたは、--updateケース 2 で何も変更されない場合、コンテンツはコピーされ続けます。outputFolder/inputFolder

outputFolderまず、存在するかどうかを確認したり(フォルダがない場合...)、使用せずにこれを行う方法はありますかrm -rf outputFolder

合意された移植可能なUNIXアプローチは何ですか?

答え1

代わりにこれを使用してください:

cp -R inputFolder/. outputFolder

これはまったく同じように機能しますcp -R aaa/bbb cccccc存在しない場合はbbbその内容のコピーとして作成されますが、cccすでに存在する場合はその内容のコピーccc/bbbとして生成されます。bbb

このようなほとんどすべてのbbb状況で、あなたの質問に指摘した望ましくない動作が発生します。しかし、この特別なケースでは、「bbbjust」も.「really just」aaa/bbbも同じですaaa/.。これは「really just aaa」ですが、名前が異なります。したがって、次の2つの状況があります。

  1. ccc存在しない:

    このコマンドは、「の内容をcp -R aaa/. ccc作成してコピーする」という意味です。cccaaa/.ccc/.aaaccc

  2. ccc存在しますか?

    このコマンドはcp -R aaa/. ccc「コンテンツaaa/.をにコピーしますccc/.。つまり、aaaにコピーしますccc

答え2

フォルダをコピーせずに内容だけをコピーしてください。

## Create the target directory. The -p suppresses error messages
## if the directory already exists
mkdir -p outputFolder

## Copy the contents recursively, this will not recreate the parent
cp -R inputfolder/* outputfolder/

これにより、スクリプトの最初の実行時にターゲットディレクトリが作成され、2回目の実行時に問題が発生しないようにすることができます。

Chris Downはbashで名前を.shopt -s dotglob

両方-p~のためmkdirそして-R~のためcpPOSIX によって定義されるため、完全に移植可能でなければなりません。

答え3

-Tselectを試してくださいcp。これは GNU coreutilscpバージョン 8.22 に存在し、それ以上移植できない可能性があります。

答え4

-tコマンドオプションを使用できますcp

cp -R inputFolder -t outputFolder

これで、ターゲットフォルダがないとエラーが発生します。

cp: failed to access ‘outputFolder’: No such file or directory

上記のコマンドは、inputFolder内容だけでなく内容も一緒にコピーされます。

内容だけをコピーしたい場合は少しトリッキーですinputFolder(アスタリスク*を使用するときはシェルワイルドカードを使用するときは注意が必要です)。

cp -R  -t outputFolder/ -- inputFolder/*

これで、ターゲットフォルダがないとエラーが発生します。

cp: failed to access ‘outputFolder’: No such file or directory

そしてcp (GNU coreutils) 8.23

関連情報