リモートコンピュータ上のファイルを、ファイル名がプレフィックス文字列と一致するローカルコンピュータにコピーしたいと思います。
次のコマンドを使用して、名前またはで始まるファイルのみを選択してみましたmassif
。calgrind
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
使用してシェルオプションを有効にする必要があります(参照:shopt
shopt
組み込み) Bash 拡張モードはデフォルトで有効になっていないためです。
prompt% scp username@hostname:"/home/user/dirname/@(foo|bar)*" .
Bashサブパターンを使用@(PATTERN-LIST)
すると、1つ以上のパターンで区切られたリストを指定できます|
。与えられたパターンの1つと一致します。たとえば、、、、と一致しますが、@(foo|bar)
一致しません。foo
bar
foobar
barfoo
foofoo
barbar
グローバルアスタリスクは、空の文字列を含むすべての文字列と一致します。したがって、このパターンは、または(プレフィックス(サブ)文字列)で始まる@(foo|bar)*
すべてのファイル名と一致します。foo
bar
この方法は、リモートシェルがBashで、対応するextglob
シェルオプションが有効になっている場合に機能します。ユーザーは、~/.bash_profile
リモートシステムの構成ファイルでこのBashオプションを有効にできます(例:)。
2番目の方法
このメソッドは、異なるパラメータを使用して同じコマンドを複数回実行します。 POSIX互換シェルを使用して動作します。
for prefix in foo bar
do
scp username@hostname:"/home/user/dirname/${prefix}*" .
done
サポート拡張
結果式が存在しないファイル名を指定できるため、この方法は信頼できません。