正規表現でscpする方法


13

kshで、文字「a」で始まらないすべてのファイルをコピーしようとしています。

ソースマシンから宛先マシンへのコピーは正常に機能しています

scp -p !(a*) user@machine:/path/directory/.

しかし、私が宛先サーバーにいて、ソースサーバーからコピーしたい場合、失敗しています:

scp -p user@machine:/path/!(a*) .

何か案は?

回答:


16

フォンブランドに同意します。グローブは、実行中のシェルによって処理されます。したがってscp user@machine:/path/*、/ path / *は、リモートマシン上ではなく、LOCAL / path / *内のファイルに展開されます。

しかし、私は笑顔のためだけに試しました:

scp "user@machine:/path/[regex here]" .  

そして....それは働いた。やってみて 引用符に注意してください。とても必要です。私たちに知らせて。

注:リモートマシン上のユーザーアカウントがより別のシェルプログラムをデフォルトにもあなたのワイルドカード拡張のルールが異なる場合がありますので、陶器いる」ので、。


1

これは「正規表現を使用したSCP」ではなく、ファイルグロブを処理するのはシェルです。scp既に展開されたファイルのリストが渡されるだけです。そして、コマンドが実行されるマシンで展開が行われます。

申し訳ありませんが、(簡単に)できません。


この答えは間違っています。削除してください:)
マイケル

1

私が見つけたのは、古い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

どちらのソリューションも11.11サーバーで動作します。
DarkHeart

0

に渡されるリモート名は、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*) .
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.