我很确定这是显而易见的,但目前我正在这样做:
count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | wc -l`
这给了我想要的数字,但是屏幕上没有显示任何内容(尽管我无论如何都会丢失错误行)。
有没有办法做到这一点(获取wc -l count到count变量),同时还在一个命令中显示输出到控制台?我很确定这里可以使用像tee
这样的东西,但是我的大脑并没有像它那样工作。
否则,我想使用tee
写入临时文件和控制台并将cat
写回wc
会有效,但我相信必须有更优雅的方式这样做。
编辑 抱歉,这个问题似乎不清楚。我不想显示计数到屏幕,我想显示我的输出一直在计数,即:来自find的输出
答案 0 :(得分:5)
啊,所以你想要打印正常输出,并且$count
中有匹配数?
试试这个:
count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee /dev/tty | wc -l`
答案 1 :(得分: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)作为sidechannel,那么您可以打开原始标准输出的副本并改为引用它:
exec 3>&1
count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee /proc/self/fd/3 | wc -l`
$ 0.02
答案 2 :(得分:1)
unset x
echo ${x:="$(find $dir -type f \( -perm -007 \) -print 2>/dev/null | wc -l)"}
echo $x
输出
16
16
答案 3 :(得分:1)
以下是您澄清问题的答案。这将计数置于变量$ count中并显示find的输出:
found=$(find $dir type f \( -perm -007 \) -print 2>/dev/null)
count=$(echo -e "$found" | wc -l)
echo -e "$found"
答案 4 :(得分:0)
我不确定我是否完全理解,因为所写的find命令不需要括号而且不应该产生任何错误,我不知道你是否需要将输出转到stdout或者如果你只是想看到它工作,在这种情况下,stderr也可以正常工作。我会这样做:
count=`find $dir -type f -perm -007 -print -fprint /dev/stderr | wc -l`
答案 5 :(得分:0)
如果tee
将命令的stdout发送到stderr(此处通过匿名fifo),则可以打印find to 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"