私が使うとき
cp -R inputFolder outputFolder
明らかにする状況によって異なる:
outputFolder
存在しない場合、複製されたフォルダパスはですoutputFolder
。- 存在する場合、
outputFolder
生成されたクローンはoutputFolder/inputFolder
これは怖すぎる、いくつかのインストールスクリプトを作成したいので、ユーザーが誤って2回実行すると最初に生成され、2outputFolder
回目の実行ではすべてが再生成されますoutputFolder/inputFolder
。
- 私はいつも最初の動作をしたいです。つまり、元のオブジェクトの横にレプリカ(兄弟として)を作成します。
- 私が使いたいのはポータブルです。 (たとえば、MINGWは出荷され
cp
ません。)rsync
- 確認しましたが、
cp -R --parents
ディレクトリツリーのパスが再生成されます(したがってレプリカはそうではありませんoutputFolder
)some/path/outputFolder
。 --remove-destination
または、--update
ケース 2 で何も変更されない場合、コンテンツはコピーされ続けます。outputFolder/inputFolder
outputFolder
まず、存在するかどうかを確認したり(フォルダがない場合...)、使用せずにこれを行う方法はありますかrm -rf outputFolder
?
合意された移植可能なUNIXアプローチは何ですか?
答え1
代わりにこれを使用してください:
cp -R inputFolder/. outputFolder
これはまったく同じように機能しますcp -R aaa/bbb ccc
。ccc
存在しない場合はbbb
その内容のコピーとして作成されますが、ccc
すでに存在する場合はその内容のコピーccc/bbb
として生成されます。bbb
このようなほとんどすべてのbbb
状況で、あなたの質問に指摘した望ましくない動作が発生します。しかし、この特別なケースでは、「bbb
just」も.
「really just」aaa/bbb
も同じですaaa/.
。これは「really just aaa
」ですが、名前が異なります。したがって、次の2つの状況があります。
ccc
存在しない:このコマンドは、「の内容を
cp -R aaa/. ccc
作成してコピーする」という意味です。ccc
aaa/.
ccc/.
aaa
ccc
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
~のためcp
POSIX によって定義されるため、完全に移植可能でなければなりません。
答え3
-T
selectを試してください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