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


12

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

だから私はやります:

mkdir /new_place
cp the_file /new_place

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

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

回答:


17

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

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

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

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

作成します~/Desktop/Downloads


5

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

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

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

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

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


必要であればthe_file、あなたは追加する必要が/あなたの新しいディレクトリパスの最後に。
mfink

1

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

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

0

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

mkdir folder; cp file.html folder

そしてそれは動作するはずです。

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