3

コマンドを実行してfindから、出力の行数を数え、結果の出力を出したいです。私の率直なアプローチはこれでした:

output=$(find ...)
lines=$(echo "$output" | wc -l)
echo "$output"

しかし残念なことに、echoこれをパイプするために使用するwcと改行が追加されるため、find何も見つからなかった場合でも (出力のゼロ行)、それwcは(追加され1た改行に対して.echo

echo出力に改行が追加されないように を aに変更しましたが、 likeprintfの 1 行の出力にも改行がなかったため、が出力されました。findvar/wc0

問題は、出力のキャプチャにあります ( $(...))。私の場合は関連する末尾の改行を取り除きます。

これをどうにかして防ぐことはできますか?

元のタスクにまったく異なるアプローチはありますか?

4

3 に答える 3

5

頭に浮かぶ簡単な回避策は、文字列が空かどうかを確認することです。

[ -z "$output" ] && count=0 || count=$(wc -l <<< "$output")

count出力が生成されない0場合findは、出力の行数が含まれます。

于 2014-04-25T13:59:21.053 に答える
2

出力に偽の行を追加することで回避策を使用しています。このようにして、1 行が常に存在するという事実を信頼できます。このようにして、空の行と 1 行を簡単に区別できます。

r=$(find var/ -name var -printf "%p\n"; echo '==')
# appending additional line to be able to distinguish 0 from 1 found file
case "$(echo "$r" | wc -l)" in
  1)  # means 0 found files
    ...
  2)  # means 1 found file
    ...
  *)  # means more found files
    ...
esac
于 2014-04-25T14:34:45.563 に答える