回答:
フォンブランドに同意します。グローブは、実行中のシェルによって処理されます。したがってscp user@machine:/path/*
、/ path / *は、リモートマシン上ではなく、LOCAL / path / *内のファイルに展開されます。
しかし、私は笑顔のためだけに試しました:
scp "user@machine:/path/[regex here]" .
そして....それは働いた。やってみて 引用符に注意してください。とても必要です。私たちに知らせて。
注:リモートマシン上のユーザーアカウントがより別のシェルプログラムをデフォルトにもあなたのワイルドカード拡張のルールが異なる場合がありますので、陶器いる」ので、。
私が見つけたのは、古いHP-UXマシン(パリス11.11)では[^ a] *を使用しなければならなかったことですが、新しいマシン(パリス11.31以降)では!(a *)で動作します
これが私がやったことです。そしてそれは動作します:
if [[ ${S_MACH} = "phd026a" || ${S_MACH} = "tht030a" ]]
then
scp -p -r ${S_MACH}:${S_DIR}/bin/[^a^b^c^p]* ${D_DIR}/bin/.
else
scp -p -r ${S_MACH}:${S_DIR}/bin/!((a*)|(b*)|(c*)|(p*)) ${D_DIR}/bin/.
fi
に渡されるリモート名は、scp
実際には、リモート側のパターンの空白区切りリストとして解釈されます。名前にスペースが含まれるファイルをコピーしようとすると、多くの場合これは煩わしいですが、ここでは便利です。scp -p 'user@machine:/path/a*' .
名前がで始まるすべてのファイルをコピーしますa
。
別のハードルに合格した場合に、ローカルではなくリモートで解釈されるようにパターンを引用すると、コマンドが機能します。このパターン!(a*)
は基本的なシェルパターンではなく、ksh拡張です(適切なオプションを設定すると、bashとzshもサポートされます)。したがって、これはリモートシェルがkshである場合にのみ機能します。他のシェルでありexec ksh
、.profile
ユーザーが他のシェルである場合、または類似の場合は機能しません。
簡単な方法は、何らかの制限された環境やアンティーク環境にいる場合を除き、を忘れることscp
です。リモートファイルをローカルファイルと同じように機能させるには、ローカルファイルにします。リモートディレクトリをsshfsでマウントします。これには、ローカルマシン上のFUSEと、リモートマシン上のSFTPサーバー(起動するsftp-server
実行可能ファイルsshd
)が必要です。
mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .