web-dev-qa-db-ja.com

ファイルをコピーすると同時にターゲットディレクトリを作成するにはどうすればよいですか?

したい cp aaa/deep/sea/blob.psdからbbb/deep/sea/blob.psd

deepおよびseaディレクトリーがbbbの下に存在しない場合、どのようにコピーを実行すれば、コピーの両方で必要なディレクトリーが作成され、ファイルがコピーされますか?

今私は得る
No such file or directory深海は存在しません。

私は男のヘルプページやその他の質問を通して調べましたが、私には何も飛び出していません。

私が持っている最も近いものは、ディレクトリにrcpを使用しています:

rcp -r aaa/deep/sea/ bbb/deep/sea/

ただし、これはディレクトリ全体とコンテンツをコピーするので、1つのファイルだけが必要です。それをしようとすると、しかしcp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

20
Michael Durrant

このような状況では、次の関数を使用してみてください。

copy_wdir() { mkdir -p -- "$(dirname -- "$2")" && cp -- "$1" "$2" ; }

そしてそれを

copy_wdir aaa/deep/sea/blob.psd bbb/deep/sea/blob.psd

ちなみに、GNU cpには--parentsオプション。それは本当にあなたが望むものに近いですが、正確ではありません。
また、不要と思われるaaaディレクトリも作成されます。ただし、最初にaaaにcdして、次のようにコピーできます。

cd aaa && cp --parents deep/sea/blob.psd ../bbb/
19
rush

coreutilsinstallプログラムを使用するのは簡単です。これは、automake

install -D /path/to/source /path/to/destination

installは、mkdir -pと同様に、パスのall部分を作成することに注意してください。man installを参照してください。なぜそれをしたいのかwhyを含めなかったのか、私は興味があります。 mkdircpの呼び出しは非常に簡単です。

24
Pavel Šimerda

標準(POSIX/Unix)コマンドを使用すると、以下が得られます。

pax -rws ':^:dest/dir/:' file .
6

私はcpを使用してそれを行う方法を知りませんが、rsyncを使用することは確かに可能です:

$ rsync sourcefile dir/

ここで、dirは、存在する必要がないディレクトリです。他のコマンドを使用して同じことを達成する他の多くの方法があります。

5
mjturner
cd aaa
pax -rw deep/sea/blob.psd ../bbb

paxがない場合(POSIXにより、標準化するには非互換性が多すぎてcpioとtarの標準的な置き換えとして義務付けられています)、代わりにcpio -pまたはtar -cf - … | tar -xf -を使用します。