scpで正規表現を使用する方法

scpで正規表現を使用する方法

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

ソースコンピュータからターゲットコンピュータにコピーする方法は次のとおりです。うまくいく:

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

ただし、ターゲットサーバーにあり、ソースサーバーからコピーしようとすると失敗します。

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

どんなアイデアがありますか?

答え1

私は電話ブランドのコメントに同意します。 Globingは実行中のシェルで処理されます。したがって、scp user@machine:/path/*/ path / *はリモートシステム上のファイルではなく、ローカル/ path / *のファイルに展開されます。

しかし、私は笑いのために次のことを試しました。

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

そして…動作します。試してみてください。引用符に注意してください。非常に必要です。私たちに教えてください。

注:リモートコンピュータのユーザーアカウントは、デフォルトで他のコンピュータとは異なるシェルに設定できます。あなたのそのため、ワイルドカード拡張ルールが異なる場合がありますのでご注意ください。

答え2

渡されたリモート名は、scp実際にはリモート側でスペースで区切られたパターンのリストとして解釈されます。これは通常、名前にスペースを含むファイルをコピーしようとすると面倒ですが、ここでは便利です。scp -p 'user@machine:/path/a*' .名前はで始まり、コピーされますa

ローカルではなくリモートで解釈されるようにパターンを参照している場合は、他の障害物を通過するとコマンドが機能します。このモードは!(a*)デフォルトのシェルモードではなくksh拡張です(適切なオプションが設定されている場合はbashとzshでもサポートされています)。したがって、これはリモートシェルがkshの場合にのみ機能し、他のシェルexec kshから来た.profile場合、または同様の場合は機能しません。

ある種の制限された環境や古い環境にない限り、最も簡単な方法はscpリモートファイルがローカルファイルのように動作するようにすることです。sshfs。これには、ローカルシステムにFUSEが必要で、sftp-serverリモートシステムにSFTPサーバー(つまり起動された実行可能ファイル)が必要です。sshd

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .

答え3

これは「正規表現を使用するscp」ではなく、ファイルグローブを処理するシェルです。scp拡張ファイルのリストを入手してください。拡張は、コマンドが実行されるシステムで発生します。

答え4

以前のHP-UXシステム(parisc 11.11)では[^ a] *を使用する必要がありましたが、最新のシステム(parisc 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

関連情報