文字 "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