Bash获取wC语言 l编号并在一个命令中显示



我很确定这将是显而易见的,但目前我这样做:

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

这得到了我想要的数字,但在屏幕上不显示任何东西(尽管我丢弃了错误行)。

是否有一种方法可以做到这一点(获得wc -l count到count变量),同时还显示输出到控制台,在一个命令中?我很确定像tee这样的东西可以在这里使用,但是我的大脑不像它应该的那样工作。

否则,我猜写一个临时文件和控制台使用teecat它回到wc将工作,但我非常确信必须有一个更优雅的方式做到这一点。

edit:对不起,似乎问题不清楚。我不想在屏幕上显示计数,我想显示我一直在计数的输出,即:find

的输出

啊,所以您想打印正常输出,并在$count中拥有匹配的数量?

试试这个:

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

好了,下面是更新后的问题的答案

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)作为这里的侧通道,那么您可以打开原始标准输出的副本并引用它:

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

这是你澄清问题的答案。这将计数放入变量$count中,并显示find:

的输出
found=$(find $dir type f ( -perm -007 ) -print 2>/dev/null)
count=$(echo -e "$found" | wc -l)
echo -e "$found"

更新我在问题更新后添加了另一个答案

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

输出
16
16

我不确定我完全理解,因为find命令不需要括号,也不应该产生任何错误,我不知道您是否需要将输出输出到标准输出,或者您只是想看到它工作,在这种情况下,标准输出也可以正常工作。我会这样做:

count=`find $dir -type f -perm -007 -print -fprint /dev/stderr | wc -l`

如果您将查找命令的标准输出tee到标准错误(这里通过匿名fifo),则可以将查找的输出打印到屏幕。

如果文件名或路径中嵌入了换行符,计数就会出错。因此,使用find的-print0特性,然后使用tr命令删除中不 ''的所有字节,最后在最后使用wc命令计算''字节。

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

最新更新