これら2つの単語を含むファイルをディレクトリから検索したいと思います。ワード1そしてワード2。ローカルディレクトリから検索する場合は、次のコマンドを使用すると正常に動作します。
for FILE in pathToDirectory/*.txt; do grep -q word1 $FILE && grep -q word2
$FILE && echo $FILE; done
リモートホストでは変数を使用できません。どうすればよいですか?別のスレッドで見つけました(SSHによるリモートforループ)人々はこのコマンドを使用してサーバーに接続し、findコマンドを次の引用符で囲みます。これに似ています:
ssh -l username servername 'for FILE in pathToDirectory/*.txt; do grep -q word1 $FILE && grep -q word2 $FILE && echo $FILE; done'
しかし、これはまだ私には効果がありません。
今実行するコマンドは次のとおりです(まだエラーが発生します)。
ssh username@servername sh -c 'for FILE in /pathToDirectory/*.txt; do grep -q "word1" "$FILE" && grep -q "word2" "$FILE" && echo "$FILE"; done'
間違い
FILE: -c: line 0: syntax error near unexpected token `newline'
FILE: -c: line 0: `for'
FILE: Undefined variable
答え1
デフォルトのシェルはtcsh
リモートホストにあるため、明示的にシェルを起動する必要があるかもしれませんsh
。
ssh username@servername sh -c 'for FILE in pathToDirectory/*.txt; do grep -q "word1" "$FILE" && grep -q "word2" "$FILE" && echo "$FILE"; done'
$FILE
また、外国文字を含むファイル名を処理するには、変数拡張を二重引用符で囲む必要があります。
word1
また、およびを使用しても、これは次word2
のようになります。grep
一般的な表現まさか性格。ファイル内の単語を見つけるにはを使用しますgrep -wF "word"
。
ssh
リモートホストで指定されたコマンドを実行するためにログインシェルが常に実行されているようですtcsh
。本当に大変ですコマンドラインスクリプトから正しい引用符を取得してください。
2つの解決策(どちらも気に入らない):
リモートホストのログインシェルを同じ
sh
ようなシェルに変更しますbash
。ホストシステムにログインして実行します。ksh
zsh
chsh
スクリプトファイルにスクリプトを挿入し、
ssh
次のコマンドで実行します。ssh username@servername sh ./script.sh