Perl在qx中使用find

时间:2014-09-17 10:05:10

标签: perl find syntax-error qx

III我正在编写一个Perl脚本,需要通过SSH连接到众多远程服务器来执行一些日志文件的压缩。在接下来的行中,我一直收到此错误,并且正在努力确定导致此错误的原因。我得到的错误是;

bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `cd /appdata/log/cdmbl/logs/; echo cd /appdata/log/cdmbl/logs/; find . -type f ( -iname '*' ! -iname '*.gz' ) -mmin +1440 ;; exit 0'

当然,正如你可以通过错误判断的那样,我想写的是

my $id = qx{ssh -q $cur_host "cd $log_path; echo cd $log_path; find . -type f \( -iname '*' ! -iname '*.gz' \) -mmin +1440 \;; exit 0"};

我是否在这里忽略了一些导致意外令牌的事情('问题我是 接收?

注意:我从find中删除了-exec,所以我可以看看我是否可以先解决这个问题。

感谢。

3 个答案:

答案 0 :(得分:2)

这可能不会回答你的问题,但我想提出一个不错的选择。

您说您无法在生产服务器上安装其他模块。你需要运行一堆东西,你正在寻找文件并压缩它们。这一切都可以在Perl中完成,并且您可能比通过Perl脚本执行命令行操作更多地控制它。方法

看看Object::Remote,这是为了这个目的而编写的。它允许您在机器上运行并运行已安装在本地计算机上的Perl。这样,您无需在遥控器上添加模块或安装任何东西。所有它需要的是任何或多或少的最新Perl,幸运的是几乎每个Linux都附带。

a very good lightning talk about it by the author马特特劳特值得一看。

答案 1 :(得分:2)

您需要反斜杠贝壳的括号。在双引号中使用单反斜杠是不够的,Perl删除了反斜杠。使用双反斜杠\\(

答案 2 :(得分:0)

如果您构建的命令导致语法错误,那么第一步是不是要查看您构建的命令?

print qq{ssh -q $cur_host "cd $log_path; echo cd $log_path; find . -type f \( -iname '*' ! -iname '*.gz' \) -mmin +1440 \;; exit 0"}, "\n";