web-dev-qa-db-ja.com

ファイルを新しい場所にコピーして、ディレクトリも作成するにはどうすればよいですか

ファイルを別のディレクトリにcpしたいのですが、そのディレクトリがまだ存在していません。

だから私はやります:

mkdir /new_place
cp the_file /new_place

これを1つでできますか?
「m」が「存在しないディレクトリを作成する」を意味する場合、cp the_file -m /new_placeのようなものを想像します

これはscp、rsync、または別のコピーユーティリティを使用するチャンスですか?

11
Michael Durrant

--parentsを使用すると、ソースから宛先へのディレクトリを再作成できます。例えば:

cp --parents ~/Downloads/test.txt ~/Desktop/

サブディレクトリ~/Desktop/home/desgua/Downloadsを作成し、test.txtをその中にコピーします。そして

cp --parents Downloads/test.txt ~/Desktop/

~/Desktop/Downloadsを作成します。

16
desgua

次のコマンドでこれを行うことができます

# rsync --recursive the_file /path/to/your/dir/that/doesn't/exists/

注:パスの最後に「/」を使用:

  • ソースの最後に「/」を使用すると、rsyncは最後のフォルダーのコンテンツをコピーします。ソースの最後に「/」を使用しない場合、rsyncは最後のフォルダーとフォルダーのコンテンツをコピーします。

  • 宛先の最後に「/」を使用すると、rsyncは最後のフォルダー内にデータを貼り付けます。宛先の最後に「/」を使用しない場合、rsyncは最後の宛先フォルダー名でフォルダーを作成し、そのフォルダー内にデータを貼り付けます。

5
OrangeTux

desguaの答え は適切で簡単な方法ですが、もしあなたがprotableな方法を必要としたらどうでしょう? POSIX--parentフラグなしでcpを定義するため、すべてのシステムで機能するわけではありません。

1つのオプションは、システムにインストールされている場合、Pythonで記述することです。

#!/usr/bin/env python3
from os import makedirs
from os.path import exists,basename
from shutil import copyfile
from sys import argv

if len(argv) < 3:
   print('Not enough args',file=stderr)
   exit(1)

filename = basename(argv[2])
dirs = argv[2].replace(filename,'')
makedirs(dirs)
copyfile(argv[1],argv[2])

これは次のように機能します。

$ ./mkdircp.py /etc/passwd $HOME/foodir/bardir/passwd.copy
$ stat --printf "%F\n" $HOME/foodir/bardir/passwd.copy
regular file
$ head -n 1 $HOME/foodir/bardir/passwd.copy
root:x:0:0:root:/root:/bin/bash
1

;を使用すると、2つのコマンドを簡単に入力できます。例えば:

mkdir folder; cp file.html folder

動作するはずです。

0
Galja Moehn