web-dev-qa-db-ja.com

ファイルをコピー先にコピーするために必要なフォルダーをcpコマンドに作成させる方法

cpを使用して存在してもしなくてもよいフォルダーにファイルをコピーする場合、必要に応じてフォルダーを作成するためにcpを取得するにはどうすればよいですか?これが私が試したことです。

[root@file nutch-0.9]# cp -f urls-resume /nosuchdirectory/hi.txt
cp: cannot create regular file `/nosuchdirectory/hi.txt': No such file or directory
393
omg

クリスチャンの答えを拡大するために、これを行うための唯一の信頼できる方法はmkdircpを組み合わせることです。

mkdir -p /foo/bar && cp myfile "$_"

余談ですが、既存の階層内に単一のディレクトリを作成するだけでよい場合は、rsyncが1回の操作でそれを実行できます。私はrsyncをもっと用途の広いcpの代替品として大好きです。実際、

rsync -a myfile /foo/bar/ # works if /foo exists but /foo/bar doesn't.  bar is created.
229
lhunath

私はあなたがcpでそれをすることができることを知りませんでした。

あなたはmkdirでそれをすることができます。

mkdir -p /var/path/to/your/dir

_ edit _ cpの組み込みについてはlhunathの answer を参照してください。

96
Christian

Mac OSXを使っている人にとって、おそらくこれを回避する最も簡単な方法は ditto を使うことです(ただし、Macの場合はAFAIKです)。宛先に存在しないディレクトリ構造が作成されます。

例えば、私はこれをしました

ditto 6.3.2/6.3.2/macosx/bin/mybinary ~/work/binaries/macosx/6.3.2/

コマンドを実行する前は、~/workにbinariesディレクトリがありませんでした。

Rsyncも同様に機能するはずだと思いましたが、1レベルの見つからないディレクトリに対してのみ機能するようです。あれは、

rsync 6.3.3/6.3.3/macosx/bin/mybinary ~/work/binaries/macosx/6.3.3/

〜/ work/binaries/macosxは存在するが〜/ work/binaries/macosx/6.3.2 /は存在しないため

24
eythort
 mkdir -p `dirname /nosuchdirectory/hi.txt` && cp -r urls-resume /nosuchdirectory/hi.txt
19
Jamie McCrindle

そのような選択肢はありません。ファイルをコピーする前に、 mkdir -p を実行してください。

とてもクールな あなたが存在しない場所にファイルをコピーするのに使用できるスクリプトを作りました

#!/bin/bash
if [ ! -d "$2" ]; then
    mkdir -p "$2"
fi
cp -R "$1" "$2"

今それを保存し、それにパーミッションを与えて、それを使ってそれを実行してください

./cp-improved SOURCE DEST

私は-Rオプションを付けますが、それはドラフトです、私はそれが可能であることを知っています、そしてあなたは多くの方法でそれを改善するでしょう。あなたに役立つことを願っています

17
victor hugo

findコマンドを使うこともできます。

find ./ -depth -print | cpio -pvd newdirpathname
15
Jeff King

rsyncは仕事です!

#file:
rsync -aqz _vimrc ~/.vimrc

#directory:
rsync -aqz _vim/ ~/.vim
10
Chu-Siang Lai