我正在运行上面的shell脚本:
vQtde=`ssh user@server 'ls -lrt /mnta2/gvt/Interfaces/output/BI/sent/*.?${vDiaAnterior}* | grep "${vMDAtual}0[345678]:" |wc -l'`
返回错误:ksh: /usr/bin/sh: arg list too long
我知道本地服务器中的相同脚本返回9,如何在远程grep中转义“”?
变量是:
vDiaAtual=`date +%d`
vMesAtual=`date +%b`
vMDAtual=" $vMesAtual $vDiaAtual ";
vDiaAnterior=120614
答案 0 :(得分:3)
这里的问题不在于grep。问题如下:参数/mnta2/gvt/Interfaces/output/BI/sent/*.?${vDiaAnterior}*
由shell扩展(在案例中由ksh
扩展),结果列表太大。
最好只做ls -lrt /mnta2/gvt/Interfaces/output/BI/sent/
,然后在其后再添加grep
。
类似的东西:
ls -lrt /mnta2/gvt/Interfaces/output/BI/sent/ | grep "\..${vDiaAnterior}" | grep ...
答案 1 :(得分:1)
基于information regarding that error message,我不确定是否在此处转义引号是真正的问题。
你最终想做什么?可能会采用略微不同的方法来避免这个问题。您似乎正在尝试计算具有特定“上次修改”日期的文件数。这准确吗?如果是这样,我强烈建议反对使用ls
的输出来做到这一点。平台之间的输出不一致,甚至可以在不同版本之间进行更改。 find
实用程序更适合这类事情。
尝试这样的事情:
dir=/mnta2/gvt/Interfaces/output/BI/sent/
pattern="*.?${vDiaAnterior}*"
time= # Fill this in based on the "last modified" time that you're looking for
find $dir -iname "$pattern" -mtime $time -exec printf '.' \; | wc -c
您可以省略使用额外的变量,它们只是为了让代码在网页上更具可读性。
这将在给定目录中搜索名称与指定通配符模式匹配的所有文件,以及与您指定的内容匹配的“最后修改”时间。对于找到的每个匹配,将运行代码printf '.'
(将一个点打印到stdout)。然后wc
计算点字符数,这将等于找到的匹配文件数。这种方法的好处是它可以最大限度地减少需要在程序之间传输的数据量(包括shell和ls
之间)。 find
在内部处理通配符匹配,而不是要求shell扩展通配符并将结果传递给ls
。您也只是将每个匹配文件中的一个字符发送到wc
,而不是每个匹配输出一行长ls
。这应该会减少你遇到“arg list too long”错误的可能性。
答案 2 :(得分:0)
我用这种方式解决了这个问题: - 在接收参数的本地服务器中创建文件.sh:
#!/usr/local/bin/bash
vDiaAnterior = “$ {1}”; vMDAtual = “$ {2}”;
ls -l / mnta2 / gvt / Interfaces / output / BI / sent /*.?$ {vDiaAnterior} AMA | grep“$ {vMDAtual} [345678]:”| wc -l;
ssh user @ server“./mnta1/prod_med1/scriptsf/ver_jobs_3_horas.sh $ vDiaAnterior'$ vMDAtual'”
最诚挚的问候, 考卡