2

我正在运行一个类似上面的 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
4

3 回答 3

3

这里的问题不在于 grep。问题如下:参数/mnta2/gvt/Interfaces/output/BI/sent/*.?${vDiaAnterior}*由 shell 扩展(ksh在本例中为 by),结果列表太大。

最好简单地做ls -lrt /mnta2/gvt/Interfaces/output/BI/sent/,然后在它之后添加额外grep的。

就像是:

ls -lrt /mnta2/gvt/Interfaces/output/BI/sent/ | grep "\..${vDiaAnterior}" | grep ...
于 2012-06-15T16:43:12.850 回答
1

根据有关该错误消息的信息,我不确定转义引号是否是这里的真正问题。

你最终想要做什么?可能有一种稍微不同的方法可以避免这个问题。您似乎正在尝试计算具有某个“最后修改”日期的文件数。这是准确的吗?如果是这样,我强烈建议不要使用 的输出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 '.'运行代码(将一个点打印到标准输出)。 wc然后计算点字符的数量,这将等于找到的匹配文件的数量。ls这种方法的好处是它最大限度地减少了程序之间(包括 shell 和) 之间需要传输的数据量。find在内部处理通配符匹配,而不是要求 shell 扩展通配符并将结果传递给ls. 您也只向每个匹配文件发送一个字符,wc而不是一长行ls每场比赛的输出。这应该会减少您遇到“arg list too long”错误的机会。

于 2012-06-15T17:05:50.487 回答
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 用户@服务器“。/mnta1/prod_med1/scriptsf/ver_jobs_3_horas.sh $vDiaAnterior '$vMDAtual'”

结果:9 个文件。

最好的问候,考卡

于 2012-06-15T19:34:05.217 回答