scp を使用して複数のディレクトリ内のすべてのファイルを取得する

scp を使用して複数のディレクトリ内のすべてのファイルを取得する

A1/B1/C1/files111*、、、などA1/B1/C2/files112*のディレクトリ構造があり、すべてのディレクトリ内のすべてのファイルが一意です。scp (または他のツール) を使用して、すべてのターミナル ファイルを一度に取得する方法はありますか?A1/B2/C1/files121*A1/B2/C2/files122*files###*

答え1

質問でこれを指定していないので、ディレクトリ構造はリモートであり、ローカルにしたいと想定します。

必要なのは、ワイルドカードを使用するが、クライアント側でそれらをエスケープして、ローカル シェルがそれらを無視して渡すようにすることです。これを再帰フラグ ( -r) と組み合わせると、希望どおりに動作するはずです。

scp -r remotemachine:some/directory/files\*   /some/local/target/directory/

重要なのはバックスラッシュです。これにより、ローカル シェルはアスタリスクを無視し、代わりにそれを渡します。これにより、files*サブディレクトリを含むリモートからすべてをプルできるようになります。また、名前が で始まる実際のファイルもプルされますfiles*

答え2

まず、この方法でコピーされたファイルに何が起こるか、そしてそれが将来のコピー操作にどのような影響を与えるかを検討する必要があります。ファイルはそのまま残りますか? 削除されますか? アーカイブされますか? これらがわかれば、コピー コマンドを作成し、必要なクリーンアップ操作を実行できます。以下は、まず既存のすべてのファイルをコピーし、次にリモート サーバーから削除するサンプル スクリプトです。

コピーと削除の操作の間にファイルが変更されるリスクがあるため、最初にファイルを一時ディレクトリに移動し、そこからコピーして削除し、作業ディレクトリで通常の操作を続行できるようにします。

また、毎日同じ時間にこれらのファイルを自動的に取得する cron ジョブを作成し、操作が正常に完了したことを確認するための健全性チェックを追加します。

#!/bin/bash
HOST="RemoteServerIPorHostName"
localDir="/some/local/dir"

for remoteTargets in "/A1/B1/C1/files111*" "/A1/B1/C2/files112*" "/A1/B2/C1/files121*" "/A1/B2/C2/files122*"
do
    scp -pr user@$HOST:$remoteTargets $localDir
    ssh -t user@$HOST 'rm -rf $remoteTargets'
done

答え3

ssh user@remote "find /target/A1 -iname \"*files*\" -exec scp {} user@local:/desitnation \;"
  • sshリモートマシンに接続し、二重引用符で囲まれたコードを実行します。""
  • findディレクトリ内で/target/A1キーワード「files」を含むすべてのファイルを検索します。大文字と小文字を区別しない検索パラメータにはバックスラッシュが必要であり-iname、前のペアを早期に終了しないように二重引用符が必要であることに注意してください。
  • -execは、コードを実行するために使用される別のパラメーターですfind。この場合、scpすべての検索結果を曲線括弧 で囲んで実行し、findに渡します。scp{}
  • scp見つかったファイルをローカルまたは他のマシンにコピーします。

パスワードなしで認証を使用するために公開キーを交換したため、これは私のテスト設定では機能しました。

関連情報