これらの構造を持ついくつかのフォルダーがあると仮定します
/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
のようなもの
scp
は、-r
オプションを使用した再帰的なディレクトリコピーをサポートしていますが、ファイルのフィルタリングはサポートしていません。タスクを達成するにはいくつかの方法がありますが、おそらくfind
ではなく、xargs
、tar
、ssh
、および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
最も簡単なオプション(リモートホストへの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によって)転送する必要があります。ただし、除外されたファイルは転送しないでください。
GLOBIGNOREをエクスポートして、「*」を使用できます
export GLOBIGNORE='ignore1:ignore2'
scp -r source/* remoteurl:remoteDir
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セッションを開くため、コストがかかりすぎるため、お勧めできません。
以下の例のように、拡張グロビングを使用できます。
#Enable extglob
shopt -s extglob
cp -rv !(./excludeme/*.jpg) /var/destination
ディレクトリ構造は重要ではないので、これはうまく機能します。
scp -r USER@HOSTNAME:~/bench1/?cpu/p_?/image/ .
/bench1
が現在のユーザーのホームディレクトリにあると仮定します。また、USERおよびHOSTNAMEを実際の値に変更します。