'-123.jpg' で終わるすべてのファイルを scp します - 再帰、スペース、ワイルドカード...

'-123.jpg' で終わるすべてのファイルを scp します - 再帰、スペース、ワイルドカード...

初心者の私には、ここで起きていることが多すぎて理解できません。リモート サーバー上の多数のネストされたディレクトリから、-123.jpg で終わるすべてのファイルをダウンロードしたいと考えています。これらのディレクトリの一部の名前にはスペースが含まれています。コマンドは次のようなものになると思います。

scp -r user@server:/path/to/parent\ directory/*/*/*123\.jpg ./

…「parent\ directory」はスペースを含むディレクトリ名で、指定されたパスは、さまざまなサブディレクトリに分割される前に可能な限り深くなります。たとえば、dir/sub dir/[uniquely_id]-123.jpg ファイルです。(これらのサブディレクトリにはスペースも含まれることが多いため、* ワイルドカードに影響することに注意してください)

これに対して「一致なし」が返されるか、スペース エスケープをいじると「そのようなファイルまたはディレクトリはありません」というメッセージが表示されます。したがって、間違っているのは再帰またはワイルドカードであると考えています。

前もって感謝します。

答え1

scp によるファイル名のエスケープはトリッキーです。引数はリモート側で (再) 展開されます。ローカル シェルとリモートによる特別な処理を避けるために、「興味深い」文字は二重引用符で囲む必要があります。次の 2 つの方法が機能すると思います。

scp user@server:'/path/to/parent\ directory/*/*/*123.jpg' ./
scp user@server:'"/path/to/parent directory"/*/*/*123.jpg' ./

それがわかりにくい場合は、rsync は非常に使いやすく (lothar が言及しているように)、ssh 経由で tar または cpio をパイプするのも非常に簡単です。

ssh user@server 'cd /path/to/parent\ directory;
                 find -name "*123.jpg" -print0 | cpio -0 -o' |
    cpio -i -d -v

答え2

テスト用のサーバー レイアウトがないため、次のコマンドが実際に機能するかどうかはわかりませんが、その場合は、in- パターンと exclude パターンを指定できるため、scp よりも rsync の方が適していると思います。次のようになります。

rsync -arvzSH  --include "*123.jpg" --exclude "*" user@server:/path/to/parent\ directory/ /path/to/target directory/

うまくいくかもしれない。しかし、もう一度確認したほうがいい。rsync ドキュメント

答え3

ワイルドカードを使用した scp の回避策:

for i in "*-123.jpg"
do 
    scp $i <user>@<server>:/path/to/destination/
done

参照する:https://community.hpe.com/t5/System-Administration/How-to-scp-mutiple-files-using-wild-chars-or-in-a-single-scp/mp/3639440/highlight/true#M238959

答え4

これは、次の 2 つの部分に分けて適切に実行する必要があります。

  1. まず必要なファイルをすべて見つけて1つのフォルダにコピーします(同じファイル名の場合は機能しません) - 1つのフォルダで実行することもできますfindが、-exec
  2. 次に、たくさんのファイルを送信しますscp

scpフォルダー構造をコピーするには機能が不十分であり、フォルダー ツリーのコピーを作成する単一のコマンドはありません。

また、フォルダー内のすべてのファイルが必要な場合、ワイルドカードで選択することができないため、フォルダー構造を保持したい場合は、mc= Midnight Commander とその「シェル リンク」を使用することをお勧めします。

関連情報