我想在包含单词wrod1和word2的目录中搜索文件。我想在本地目录中搜索时使用以下命令,它可以正常工作:
for FILE in pathToDirectory/*.txt; do grep -q word1 $FILE && grep -q word2
$FILE && echo $FILE; done
由于在使用远程主机时无法使用变量,我该怎么办。我从其他线程(通过SSH进行远程循环)中发现,人们使用该命令连接服务器,然后将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
由于默认外壳程序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
总是将运行登录Shell来在远程主机上执行给定命令,如果确实如此tcsh
,则很难在命令行脚本中获得正确的引用。
两种解决方案(我都不喜欢):
远程主机上的登录壳改变为sh
像样壳bash
,ksh
或zsh
。通过在主机上登录并运行来执行此操作chsh
。
把脚本中的脚本文件,并通过执行它ssh
与
ssh username@servername sh ./script.sh
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句