単一のコマンドを使用して、「ls」が何かを出力するかどうかを確認できますか?

単一のコマンドを使用して、「ls」が何かを出力するかどうかを確認できますか?

TL/DR:私はSolaris 10で働いています。コマンドがあり、ls ... | egrep ...そのコマンドがどのような結果を出力するかを知る必要があります。| wc -c最後に1つを追加できますが、出力ではなく終了コードに結果(0または0以外)が必要です。そして私はそれを使用できませんif。それはbashスクリプトではなく、1つのコマンドしか実行できません。


長いバージョン:私はSolaris 10システムで古いログファイルを圧縮して削除するためのメンテナンス手順を作成しています。指定されたパス内のすべての.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。 tarを生成する前にどのように確認しますか?私はこんなことを考えました。wc を使用して出力があることを確認します。:

ls ... | egrep ... | wc -c

0ファイルが存在しない場合は正しく出力され、それ以外の場合は別の番号が出力されます。問題は次のとおりです。出力はなく、終了コードのみが表示されます。(エラーがないため常に0です。)Bashスクリプトでこれを行うのではなく、Siebel CRMを使用しています。コマンドを生成し、以下を使用して実行するjavascript関数があります。図書館システム着信電話。私が見ることができる唯一のものは終了コードです。0正常を意味し、ゼロ以外はエラーを意味します(「ゼロ以外」ではない実際の数字が表示されます)。

以前は、次の点を確認する必要がある同様の要件がありました。一つファイルが存在するかどうかこの回答これを行うのに役立ちました。

[ -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出力を比較し、目的の終了コードを返す小さなシェルスクリプトを書くことができることを知っています。また、私は実際にできるコマンドの出力にアクセスするには、それをjavascriptにリダイレクトしてから> tempfileSiebelから読み取ることができます。ただし、不要な(一時的または永続的な)ファイルの生成を避けたいので、両方のオプションを避けることをお勧めします。

ベストアンサー1

egrep一致する行がない場合は、ゼロ以外の値を返します。

おすすめ記事