2

上記のようなシェルスクリプトを実行しています:

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}*がシェルによって展開され(kshケースでは)、結果のリストが大きすぎます。

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

追加の変数を使用して省略できます。それらは、Web ページでコードを読みやすくするためだけに存在します。

これにより、指定されたワイルドカード パターンに一致する名前と、指定したものと一致する「最終変更」時刻を持つすべてのファイルが、指定されたディレクトリで検索されます。見つかった一致ごとに、コードprintf '.'(標準出力に 1 つのドットを出力する) が実行されます。 wc次に、ドット文字の数をカウントします。これは、見つかった一致するファイルの数に等しくなります。この方法の利点は、プログラム間 (シェルと の間を含むls) でパイプ処理する必要があるデータの量を最小限に抑えることです。 findは、シェルがワイルドカードを展開して結果を に渡すことを要求する代わりに、ワイルドカード マッチングを内部で処理しlsます。wcまた、1 つの長い行の代わりに、一致するファイルごとに 1 文字のみを送信しています。ls試合ごとの出力。これにより、「引数リストが長すぎます」というエラーが発生する可能性が低くなります。

于 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]:" | トイレ -l;

  • リモートを呼び出す:

    ssh user@server ". /mnta1/prod_med1/scriptsf/ver_jobs_3_horas.sh $vDiaAnterior '$vMDAtual'"

結果: 9 ファイル。

敬具、 カウカ

于 2012-06-15T19:34:05.217 に答える