web-dev-qa-db-ja.com

scpを再帰的に使用しますが、一部のフォルダーを除外します

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

/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にはそのようなオプションはないようです。

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

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

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

52
mahmood

scpは、-rオプションを使用した再帰的なディレクトリコピーをサポートしていますが、ファイルのフィルタリングはサポートしていません。タスクを達成するにはいくつかの方法がありますが、おそらくfindではなく、xargstarssh、およびscpに依存するでしょう。

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
44
jxh

最も簡単なオプション(リモートホストへの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によって)転送する必要があります。ただし、除外されたファイルは転送しないでください。

11
Marian

GLOBIGNOREをエクスポートして、「*」を使用できます

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

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

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セッションを開くため、コストがかかりすぎるため、お勧めできません。

2
Ofer Eliassaf

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

#Enable extglob
shopt -s extglob

cp -rv !(./excludeme/*.jpg) /var/destination
0
WackGet

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

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

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

0
Fady Ibrahim