86

これらの構造を持ついくつかのフォルダがあると仮定します

/bench1/1cpu/p_0/image/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_1/image/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/2cpu/p_0/image/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_1/image/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
....

私がやりたいのはscp、次のフォルダに移動することです

/bench1/1cpu/p_0/image/
/bench1/1cpu/p_1/image/
/bench1/2cpu/p_0/image/
/bench1/2cpu/p_1/image/

ご覧のとおり、再帰的に使用したいのですがscp、「fl_X」という名前のすべてのフォルダーを除外します。scpにはそのようなオプションがないようです。

UPDATEscp にはそのような機能はありません。代わりに、次のコマンドを使用します

 rsync -av --exclude 'fl_*' user@server:/my/dir

しかし、それは機能しません。フォルダのリストを転送するだけです!! 何かのようなものls -R

4

6 に答える 6

67

scpオプションで再帰的なディレクトリコピーをサポート-rしますが、ファイルのフィルタリングはサポートしません。タスクを実行する方法はいくつかありますが、おそらく、の代わりにfind、、、に依存します。xargstarsshscp

find . -type d -wholename '*bench*/image' \
| xargs tar cf - \
| ssh user@remote tar xf - -C /my/dir

解決策を機能させることはrsyncできますが、いくつかの議論が欠けています。また、サブディレクトリに再帰するrsyncためのスイッチも必要です。rまた、と同じセキュリティがscp必要な場合は、の下で転送を行う必要がありますssh。何かのようなもの:

rsync -avr -e "ssh -l user" --exclude 'fl_*' ./bench* remote:/my/dir
于 2013-02-27T23:34:15.473 に答える
27

パターンを指定GLOBIGNOREして使用できます*

GLOBIGNORE='ignore1:ignore2' scp -r source/* remoteurl:remoteDir

を使用して組み合わせたりオーバーライドしたりする一般的なルールが必要な場合もありますがexport GLOBIGNORE、アドホックな使用法の場合は、上記で十分です。文字は、複数の値の:区切り文字として使用されます。

于 2017-05-02T11:22:49.787 に答える
12

最も単純なオプション(リモートホストにrsyncをインストールする)が実行可能でない場合は、sshfsを使用してリモートをローカルにマウントし、マウントディレクトリからrsyncを実行できます。そうすれば、たとえば、rsyncが提供するすべてのオプションを使用できます--exclude

このようなことをする必要があります:

sshfs user@server: sshfsdir
rsync --recursive --exclude=whatever sshfsdir/path/on/server /where/to/store

rsyncの有効性(すべてではなく、変更のみを転送する)はここでは適用されないことに注意してください。これが機能するためには、rsyncがすべてのファイルの内容を読み取って、何が変更されたかを確認する必要があるためです。ただし、rsyncは1つのホストでのみ実行されるため、ファイル全体を(sshfsによって)そこに転送する必要があります。ただし、除外されたファイルは転送しないでください。

于 2014-04-28T14:16:21.617 に答える
3

pemファイルを使用して認証する場合は、次のコマンドを使用できます(拡張子が何かのファイルは除外されます)。

rsync -Lavz -e "ssh -i <full-path-to-pem> -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --exclude "*.something" --progress <path inside local host> <user>@<host>:<path inside remote host>

-Lは、リンクをたどることを意味します(リンクではなくファイルをコピーします)。相対パスではなく、pemファイルへのフルパスを使用してください。

sshfsの使用は動作が遅いため、お勧めしません。また、上記で示したfindとscpの組み合わせも、ファイルごとにsshセッションを開くため、コストがかかりすぎるため、お勧めできません。

于 2016-08-17T04:04:22.773 に答える
1

以下の例のように、拡張グロブを使用できます。

#Enable extglob
shopt -s extglob

cp -rv !(./excludeme/*.jpg) /var/destination
于 2016-03-11T16:02:38.740 に答える
0

ディレクトリ構造は私にとって重要ではないので、これは私にとってはうまく機能します。

scp -r USER@HOSTNAME:~/bench1/?cpu/p_?/image/ .

/bench1現在のユーザーのホームディレクトリにあると仮定します。また、USERとHOSTNAMEを実際の値に変更します。

于 2019-07-16T13:14:48.717 に答える