1. ホーム
  2. bash

[解決済み] scp を再帰的に使用するが、一部のフォルダを除外する。

2023-05-12 16:58:18

質問

次のような構造のフォルダがあるとします。

/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 という名前のフォルダはすべて除外したいのですが、quot;fl_X"という名前のフォルダはすべて除外します。scpにはそのようなオプションはないようです。

アップデイト 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