2

これは明らかだと確信していますが、現在これを行っています:

count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | wc -l`

これにより、必要な数が得られますが、画面には何も表示されません (とにかくエラー行を片付けます)。

1 つのコマンドで出力をコンソールに表示しながら、これを行う方法 (wc -l カウントをカウント変数に取得する) はありますか? ここで次のようなものが使用できると確信してteeいますが、私の脳は本来のように機能していません。

それ以外の場合は、一時ファイルに書き込んでコンソールに書き込んteecat戻すwcとうまくいくと思いますが、これを行うにはもっとエレガントな方法があるはずだと確信しています。

編集: 申し訳ありませんが、質問が不明確だったようです。カウントを画面に表示したくありません。カウントした出力、つまり、find からの出力を表示したいのです。

4

6 に答える 6

5

ああ、それで、通常の出力を印刷して、一致した数を に入れたい$countですか?

これを試して:

count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee /dev/tty | wc -l`
于 2011-04-06T08:36:31.673 に答える
2

それでは、更新された質問への回答

tty のアプローチは優れていますが、ターミナル以外ではフェイルオーバーします (例: ssh localhost 'echo hello > /dev/tty' は失敗します)。

それはただの可能性があります

count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee >(cat >&2) | wc -l`

これはに相当します

count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee /proc/self/fd/2 | wc -l`

ここで stderror (fd 2) をサイドチャネルとして使用したくない/使用できない場合は、元の stdout の複製を開いて代わりに参照できます。

exec 3>&1
count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee /proc/self/fd/3 | wc -l`

$0.02

于 2011-04-06T09:21:41.523 に答える
1

更新質問が更新された後、別の回答を追加しました

unset x
echo ${x:="$(find $dir -type f \( -perm -007 \) -print 2>/dev/null | wc -l)"}
echo $x

出力

16
16
于 2011-04-06T08:36:04.760 に答える
1

これがあなたの明確な質問に対する答えです。これにより、カウントが変数 $count に入れられ、find の出力が表示されます。

found=$(find $dir type f \( -perm -007 \) -print 2>/dev/null)
count=$(echo -e "$found" | wc -l)
echo -e "$found"
于 2011-04-06T08:46:50.543 に答える
0

teefindコマンドのstdoutをstderrに送信すると(ここでは匿名FIFOを介して)、findの出力をscreenに出力できます。

ファイル名またはパスに改行が埋め込まれている場合、カウントは失敗します。したがって、findの-print0機能を使用してから、trコマンドで「\ 0」以外のすべてのバイトを削除し、最後に最後のwcコマンドで「\0」バイトをカウントします。

# show output of find to screen
count=`find . -type f \( -perm -007 \) -print0 2>/dev/null | tee >(tr '\0' '\n' > /dev/stderr) | tr -dc '\0' |  wc -c`
echo "$count"

# show output of count to screen
count=`find . -type f \( -perm -007 \) -print0 2>/dev/null | tee >(tr -dc '\0' | wc -c > /dev/stderr) | tr -dc '\0' |  wc -c`
echo "$count"
于 2011-04-06T14:10:28.757 に答える
0

書かれているように、findコマンドは括弧を必要とせず、エラーを生成するべきではないため、完全に理解しているかどうかはわかりません.出力をstdoutに送る必要があるかどうか、またはそれが機能するのを見たいだけです。その場合、stderr も同様に機能します。私はこれを行います:

count=`find $dir -type f -perm -007 -print -fprint /dev/stderr | wc -l`
于 2011-04-06T08:46:46.067 に答える