(ssh
経由で使用する必要があります。Ruby
ネットワーク/SSH) はフォルダを繰り返しコピーし、サブフォルダを除外します。私はこれを行う最速の方法を探しているので、rsync
いいえ。また、ssh
代わりにsh
。bash
Bashでは、次のことを行います。
cp -r srcdir/!(subdir) dstdir
そしてそれは素晴らしい作品です。ただし、次のようにssh
スクリプトを起動すると、
sh: 1: Syntax error: "(" unexpected
使用されているからですsh
。
マニュアルページを確認しましたが、sh
ファイルを除外するオプションはありません。
ssh
これがsh
私が使用している正しい仮定ですか?代替案はありますか?
編集1:
動作している場合、出力はsudo cat /etc/shells
次のようになります。
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen
編集2:
わかりましたので、bashを使用できますが、これは問題ではないようです。実際にsshが使用されていることを確認しましたbash
。この問題は、括弧や感嘆符のエスケープに関連しているようです。シェル(macos)でコマンドを実行してみましたが、実際のコマンドは次のとおりです。
ssh -i .ssh/key.pem [email protected] 'mkdir /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; cp -r /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!\(constant\) /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; ln -s /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/constant /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N/constant'
これにより他のエラーが発生します。
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
編集3:
コメントに基づいて追加のコマンドを変更しました。extglob
私が使うなら
ssh -i .ssh/key.pem [email protected] 'shopt -s extglob; mkdir /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; cp -r /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!\(constant\) /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; ln -s /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/constant /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N/constant'
次のエラーが発生します。
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
かっこを抜けないと手に入る
bash: -c: line 0: syntax error near unexpected token `('
ベストアンサー1
SSH は、リモートシステムが何であれ、リモートシステムでログインシェルを実行します。ただし!(foo)
、必須であるため、shopt -s extglob
リモコンに設定していない可能性があります。
SSHがリモート側でBashを実行していることを確認するには、次のようにします。
ssh me@somehost 'echo "$BASH_VERSION"'
印刷される項目があるが起動スクリプトが設定されていない場合は、extglob
次に渡されるコマンドに基づいて手動で実行できますssh
。
ssh me@somehost 'shopt -s extglob
echo srcdir/!(subdir)'
# or
ssh me@somehost $'shopt -s extglob\n echo srcdir/!(subdir)'
extglob
コマンドラインの解析に影響を与え、改行後にのみ適用されるため、リテラルの改行を入れる必要があり、セミコロンでは不十分です。
ssh me@somehost 'shopt -s extglob; echo srcdir /!(サブディレクトリ) '
同様に、バックスラッシュを使用して括弧をエスケープすると、他のグローバル文字と同様に特殊属性が失われます。この場合、あなたは望む仕事ではありません。
$ touch foo bar; shopt -s extglob; set +o histexpand
$ echo *
bar foo
$ echo !(foo)
bar
$ echo \*
*
$ echo !\(foo\)
!(foo)