同じパスにあるファイルをリモートでコピーする

同じパスにあるファイルをリモートでコピーする

いくつかのディレクトリには何千ものCSVファイルがあります。 csvファイルの1つを同じパスのリモートシステムにコピーしたいと思います。リモートシステムにディレクトリがない場合は、ディレクトリを作成してそのパスにコピーする必要があります。

foo.csvたとえば、詳しく説明します。いくつかのディレクトリにファイルがあるとしましょう。

test/
├── 201512
    └── foo.csv
    └── bar.csv
├── 201601
    └── foo.csv
    └── abc.csv 
├── 201602
    └── foo.csv
    └── xyz.csv
.
.
├── 201612
    └── foo.csv
    └── asd.csv

foo.csv元のコンピュータと同じパスにあるリモートコンピュータにコピーしたいです。したがって、リモコンの同じパス/test/201512/foo.csvにコピーする必要があります。/test/201512/リモートシステムにディレクトリパスがない場合は、新しく作成する必要があります。これを達成するためのユーティリティはありますかrsyncscp

ノート:すべてのディレクトリの内容はfoo.csv異なる場合があります)

ベストアンサー1

私のVagrantボックスで設定が完了しました。

$ mkdir -p test/20{1512,16{01..12}}
$ for d in !$; do printf 'I am a csv file in %s\n' "$d" > "$d"/foo.csv; printf 'I am a different file; do not copy me!\n' > "$d"/abc.csv; done

設定後のディレクトリ構造:

[vagrant@localhost ~]$ tree test
test
├── 201512
│   ├── abc.csv
│   └── foo.csv
├── 201601
│   ├── abc.csv
│   └── foo.csv
├── 201602
│   ├── abc.csv
│   └── foo.csv
├── 201603
│   ├── abc.csv
│   └── foo.csv
├── 201604
│   ├── abc.csv
│   └── foo.csv
├── 201605
│   ├── abc.csv
│   └── foo.csv
├── 201606
│   ├── abc.csv
│   └── foo.csv
├── 201607
│   ├── abc.csv
│   └── foo.csv
├── 201608
│   ├── abc.csv
│   └── foo.csv
├── 201609
│   ├── abc.csv
│   └── foo.csv
├── 201610
│   ├── abc.csv
│   └── foo.csv
├── 201611
│   ├── abc.csv
│   └── foo.csv
└── 201612
    ├── abc.csv
    └── foo.csv

13 directories, 26 files
[vagrant@localhost ~]$ cat test/201609/foo.csv 
I am a csv file in test/201609
[vagrant@localhost ~]$ 

次に私の箱から(失われた箱ではない):

rsync -ame 'ssh -p 2222' -f '+ */' -f '+ foo.csv' -f '- *' [email protected]:/home/vagrant/test .

結果:

$ find test
test
test/201512
test/201512/foo.csv
test/201601
test/201601/foo.csv
test/201602
test/201602/foo.csv
test/201603
test/201603/foo.csv
test/201604
test/201604/foo.csv
test/201605
test/201605/foo.csv
test/201606
test/201606/foo.csv
test/201607
test/201607/foo.csv
test/201608
test/201608/foo.csv
test/201609
test/201609/foo.csv
test/201610
test/201610/foo.csv
test/201611
test/201611/foo.csv
test/201612
test/201612/foo.csv

オプション注rsync

使用されるコマンドは次のとおりです。

rsync -ame 'ssh -p 2222' -f '+ */' -f '+ foo.csv' -f '- *' [email protected]:/home/vagrant/test .

-a「アーカイブ」スイッチは、ディレクトリを再帰的にコピーし、権限を保存するなどの操作を意味します。

-mこれは、空のディレクトリがコピーされないことを意味します(たとえば、日付ディレクトリの1つが見つからない場合、そのfoo.csvディレクトリは作成されません)。

-e 'ssh -p 2222'Vagrantボックスを使用しているため、SSHポートがポート22と異なるため、この部分は省略できます。

-f「フィルタ」ルールを導入します。ファイルを含めたり除外したりできます。私が使用しているフィルタは説明が非常に簡単である必要がありますが、フィルタを明確にするには、ファイルが検索されるようにすべてのディレクトリを'+ */'含める必要があります。foo.csv到着

これについて詳しくは、マニュアルページを参照してください。

LESS='+/INCLUDE\/EXCLUDE PATTERN RULES' man rsync

おすすめ記事