TL/DR:Solaris10で作業しています。ls ... | egrep ...
コマンドがあり、結果が出力されるかどうかを知る必要があります。か否か。最後に| wc -c
を追加するだけです。しかし、結果(0またはゼロ以外)を出力ではなく終了コードに含める必要があります。また、if
は使用できません。これは、bashスクリプトではなく、1つのコマンドしか実行できません。
長いバージョン:Solaris10システムで古いログファイルを圧縮して削除するためのメンテナンスプロセスを作成しています。指定されたパス内のすべての.logファイルまたは.xmlファイルをチェックし、指定された月に最後に変更されたファイルを取得し、それらを使用して.tarを作成してから、元のファイルを削除します。
ls -Egopqt /path/ | egrep -i '2016-10-[0123][0-9] .*(\.log$|\.xml$)' | awk '{ print $7 }'
| xargs tar -cvf target.tar
そして、ファイルを削除するのと同じですが、最後の部分を| xargs -i rm {}
に置き換えるだけです。
私はおそらくそれを複雑にしすぎていますが、それは機能します。特定の月にファイルがない場合を除きます。その場合、tar: Missing filenames
というエラーが表示されます。タールを作成する前に確認するにはどうすればよいですか?私はこのようなことを考えました wcを使用して出力があるかどうかを確認します :
ls ... | egrep ... | wc -c
ファイルがない場合は0
を正しく出力し、それ以外の場合は別の番号を正しく出力します。問題は次のとおりです:出力が表示されず、終了コードのみが表示されます(エラーがないため、常に0です)。私はbashスクリプトでこれを行っていません。私は、Siebel CRMを使用しています。コマンドを生成して Clib.system 呼び出しで実行するjavascript関数があります。私が見ることができる唯一のものは終了コードです:OKの場合は0
、エラーの場合はゼロ以外(「ゼロ以外」ではなく実際の数が表示されます)。
以前は、singleファイルが存在するかどうかを確認するために同様の要求があり、 この回答 はこれに到達するのに役立ちました:
[ -f filename ] && exit 111 || exit 0
ファイル名が存在するかどうかに応じて、111
または0
のいずれかを正常に取得しています。しかし、ls ... | egrep ... | wc
コマンドで動作させることはできません。 この構文 を使用してみました:
[[ $( ls -Egopq /path/ | egrep -i ... | wc -c ) -ne 0 ]] && exit 111 || exit 0
しかし、私は常に終了コード2を取得しています。ファイルがあるかどうかは関係ありません。私は何が間違っているのですか?
PS:チェックを実行する小さなシェルスクリプトを記述し、単純なif
を使用して出力を比較し、必要な終了コードを返すことができることはわかっています。また、実際にはコマンドの出力にアクセスできます。コマンドを> tempfile
にリダイレクトしてから、Siebelから読み取る必要があります。ただし、不要な(一時的または永続的な)ファイルの作成を回避しようとしているため、これらのオプションの両方を回避したいと思います。
一致する行がない場合、egrep
はゼロ以外を返します。
xargs
マニュアルから:
--no-run-if-empty
-r If the standard input does not contain any nonblanks, do not run the command.
Normally, the command is run once even if there is no input. This option is a GNU extension.
... | xargs -r tar -cvf target.tar
を実行すると、トリックが実行されるようです。