web-dev-qa-db-ja.com

scpでコピーするときにワイルドカード(*)を使用する方法

パスで*文字を使用しているときにscpでコピーできないのはなぜですか?

scp SERVERNAME:/DIR/* .

パスに*を許可するには、SCPにどのような構成が必要ですか?

更新:問題はサーバー側ではありません。 pscpがSCPv1を使用しようとしているため、エラーメッセージが表示されます。

scp commandline and error message regarding a file called *

153
LanceBaynes

リモートマシンでscpにリテラルエスケープを渡して、*をグロブとして処理しないようにする必要があります(二重引用符で囲まれていることに注意してください)。

scp 'SERVERNAME:/DIR/\*' .
133
Chris Down

私はパトリックのアドバイスが正しいと思いましたが、クリスの答えは私を正しい方向に導きました。引用符を使用すると、アスタリスクの前にバックスラッシュは必要ありません。

scp 'SERVERNAME:/tmp/file_num\*' .

scp:/tmp/file_num*.csv:そのようなファイルまたはディレクトリはありません

scp 'SERVERNAME:/tmp/file_num*' .

judgements_for_job_171642.csv 100%32KB 32.0KB/s 00:00
judgments_for_job_172394.csv 100%548KB 182.6KB/s 00:03

62
user1274964

注:以下で提供されるソリューションはテスト済みであり、正しく動作することがわかっています。

Singleグロビングしているパスのエイリアスの部分がある場合、引用符は変数の展開を壊します。

これは、グロブ化されたファイル名のユースケースに[〜#〜] double [〜#〜]引用符を使用するスクリプトですcommand-configure_。tar.gz *変数でエイリアスされたパスを使用:

#!/bin/bash

USEREXECUTINGSCRIPT='admin'
SCRIPTSDIR="myscripts"

SCPUSER='terrencehoulahan'
SCPUSERPASSWD='Change-Me'
SCPHOST='1.2.3.4'
SCPDIRECTORYREMOTE='/Users/terrencehoulahan/Downloads/Ubuntu/18.04'

## Uncomment appropriate below command for your distro to install "sshpass"
#apt-get -y sshpass
#yum -y install sshpass

sshpass -p "$SCPUSERPASSWD" scp -o StrictHostKeyChecking=no $SCPUSER@$SCPHOST:"$SCPDIRECTORYREMOTE/command-configure_*.tar.gz" $(getent passwd|grep ^$(echo $USEREXECUTINGSCRIPT)|cut -d ':' -f6)/$SCRIPTSDIR/

二重引用符を閉じた後、指定されたユーザーのホームディレクトリを/ etc/passwdから抽出するだけで、ローカルディレクトリターゲットが構築されます。

Scpコマンド自体はsshpassおよび-o StrictHostKeyChecking=noで始まり、ユーザーの介入なしにscpコマンドを完全に自動化します。複雑に見えますが、時々変更されることが予想されるハードコーディングパスよりも優れています。

Anyhoo、二重引用符を使用する例。グロビングしているパスの変数を展開できるようにする必要があります。 HTH

1
F1Linux

私にとっては、bashとc-Shellでは動作が異なります。なぜc-Shellを使用するのかを尋ねないでください。 bashでは必要ありません ''-c-Shellでは必要です。そのため、Linuxのバージョンによって、グロブの扱いが異なるようです。

0
Sammy777