我很确定这将是显而易见的,但目前我这样做:
count=`find $dir -type f ( -perm -007 ) -print 2>/dev/null | wc -l`
这得到了我想要的数字,但在屏幕上不显示任何东西(尽管我丢弃了错误行)。
是否有一种方法可以做到这一点(获得wc -l count到count变量),同时还显示输出到控制台,在一个命令中?我很确定像tee
这样的东西可以在这里使用,但是我的大脑不像它应该的那样工作。
否则,我猜写一个临时文件和控制台使用tee
和cat
它回到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"