在qx中使用find的Perl

在qx中使用find的Perl,perl,find,syntax-error,qx,Perl,Find,Syntax Error,Qx,我正在编写一个Perl脚本,它需要通过SSH连接到许多远程服务器来执行一些日志文件的Gzip。在下面的一行中,我一直收到这个错误,并且正在努力确定是什么导致了这个错误。我得到的错误是 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 ( -i

我正在编写一个Perl脚本,它需要通过SSH连接到许多远程服务器来执行一些日志文件的Gzip。在下面的一行中,我一直收到这个错误,并且正在努力确定是什么导致了这个错误。我得到的错误是

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,只是为了看看是否可以先解决这个问题


谢谢。

这可能无法回答您的问题,但我想提出一个不错的选择

你说过你不能在生产服务器上安装额外的模块。你需要在查找文件和压缩文件的地方运行一堆东西。这一切都可以用Perl来完成,而且你可能比通过“从Perl脚本执行命令行内容”的方法更能控制它

看一看,它正是为了这个目的而编写的。它允许您使用ssh连接到机器中,并在那里运行您在本地机器上安装的Perl内容。这样,您就不需要在远程添加模块或安装任何东西。它所需要的只是某种或多或少最新的Perl,幸运的是,几乎每台Linux上都安装了Perl有


Matt Trout值得一看。

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

如果生成的命令导致语法错误,第一步不是要查看生成的命令吗

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

您可能会在Perl中找到有用的.Core模块。也许还有
Net::SSH
。不幸的是,这些是生产服务器,所以我没有能力添加模块。因此使用上述方法。这些内容的基本调试:更改Perl脚本以打印该行,而不是执行该行。运行该行(SSH命令)你自己。它能工作吗?SSH进入远程服务器。运行你想在那里运行的命令部分。它能工作吗?如果这没有给你答案,编辑你的问题来报告你做了什么。好吧……那么,为了清楚起见。SSH在我实现它的方式中工作得很好。我不知道你是否在想我在做什么正在寻求有关.Bad命令引用的帮助。请尝试(和),它们可以为您执行引用。因此,您的答案似乎解决了原始错误。现在它产生了以下结果。这是一个好的方向。查找:路径必须位于表达式用法之前:查找[-H][L][P][path…][expression]请参阅choroba的评论,因为这似乎已经修复了最初的错误,现在我遇到了一个路径问题。我在choroba之后发布了我的答案。他告诉了你解决方案;我给了你找到解决方案的过程。(“教人钓鱼…”)