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


20

私がしたいcp aaa/deep/sea/blob.psdbbb/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

回答:


19

そのような状況では、次の機能を使用してみてください。

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/

24

automakeのようなビルドシステムでこの目的に通常使用されるcoreutilsinstallプログラムを使用するのは簡単です。

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

パスのすべての部分がinstall作成されることに注意してください。なぜあなたがそれをしたいのを含めなかったのには興味があります。呼び出しと非常に簡単です。mkdir -pman installmkdircp


2
この質問には多くの良い答えがあると思いますが、これは最も移植性が高いので私の投票を得ます。rsync答えは1つのだけのディレクトリを作成し、pax共通ではないようです。
パトリック

Macの-d代わりに使用し-Dます。
マットM.

このコマンドは755rwxr-xr-x)パーミッションで宛先ファイルを作成することに注意してください。これはおそらく望ましくありません。あなたが何か他のものを指定することができます-mスイッチを、私はちょうどする方法を見つけることができませんでし保つファイルのパーミッションを:(
törzsmókus

6

標準(POSIX / Unix)コマンドを使用すると、次のことができます。

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

1
面白い。paxについて聞いたことがありません。私はそのコンセプトが好きですが。残念ながらPOSIXであっても、デフォルトでインストールするディストリビューションはほとんどないようです:
Patrick

@Patrick-最後までスキップした場合info tar- ポータビリティの懸念セクションのどこか-GNU tarが完全にpax互換性があると主張することに気付くと思います。とにかくやってみましたが、それらの主張をテストするのにまだ取り掛かったことがありません。
mikeserv 14年

5

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

$ rsync sourcefile dir/

where dirは存在する必要のないディレクトリです。他のコマンドを使用して同じことを実現する方法は他にもたくさんあります。


3
rsync -Rディレクトリ階層を保持する必要があります
グレンジャックマン

@glennjackman確かに、「適切な」使用にrsyncはより多くのオプションが必要ですが、質問は存在しないターゲットディレクトリを作成することに関するものでした。したがって、私の簡単な答え:)
mjturner

1
少なくともGNU cpには--parentsオプションがあります。
ペテルフ

2
@peterph確かに、しかし、あなたは、ターゲットディレクトリの命名に制限されている
mjturner

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.