プレフィックス部分文字列を指定してファイル名を一致させるには?

プレフィックス部分文字列を指定してファイル名を一致させるには?

リモートコンピュータ上のファイルを、ファイル名がプレフィックス文字列と一致するローカルコンピュータにコピーしたいと思います。

次のコマンドを使用して、名前またはで始まるファイルのみを選択してみましたmassifcalgrind

scp my-machine:/home/user/a-folder/[massif,callgrind]* .

ただし、この式を使用すると、空の文字列と任意の数の文字を一致させ、ディレクトリに関連するすべてのファイル名を一致させることができます。

機能させるには何を変更する必要がありますか?

答え1

中かっこが欲しいようです。

scp my-machine:/home/user/a-folder/{massif,callgrind}* .

それ以外の場合は、2つの完全な文字列の代わりに単一の文字を一致させます。

bashさまざまな種類の拡張と置換を実行します。これらの内容は、bashのマニュアルページ - 検索セクションで説明されていますEXPANSION。このタイプは、「パス名拡張」(パス名と一致)および「Brace拡張」(存在するファイルに関係なく、指定されたオプションから複数の引数を生成する)[の下に含まれます。{

答え2

ファイルを選択する方法は2つあります。パターンを連続して指定することも、順次指定することもできます。

最初の方法

この方法はバッシュ拡張モード複数のパターンを一緒に指定してください。ユーザーは組み込みコマンドをextglob使用してシェルオプションを有効にする必要があります(参照:shoptshopt組み込み) Bash 拡張モードはデフォルトで有効になっていないためです。

prompt% scp username@hostname:"/home/user/dirname/@(foo|bar)*" .

Bashサブパターンを使用@(PATTERN-LIST)すると、1つ以上のパターンで区切られたリストを指定できます|。与えられたパターンの1つと一致します。たとえば、、、、と一致しますが、@(foo|bar)一致しません。foobarfoobarbarfoofoofoobarbar

グローバルアスタリスクは、空の文字列を含むすべての文字列と一致します。したがって、このパターンは、または(プレフィックス(サブ)文字列)で始まる@(foo|bar)*すべてのファイル名と一致します。foobar

この方法は、リモートシェルがBashで、対応するextglobシェルオプションが有効になっている場合に機能します。ユーザーは、~/.bash_profileリモートシステムの構成ファイルでこのBashオプションを有効にできます(例:)。

2番目の方法

このメソッドは、異なるパラメータを使用して同じコマンドを複数回実行します。 POSIX互換シェルを使用して動作します。

for prefix in foo bar
do
    scp username@hostname:"/home/user/dirname/${prefix}*" .
done

サポート拡張

結果式が存在しないファイル名を指定できるため、この方法は信頼できません。

関連情報