2

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

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

这让我得到了我想要的数字,但在屏幕上没有显示任何内容(尽管我无论如何都会丢弃错误行)。

有没有办法做到这一点(将 wc -l count 转换为 count 变量),同时在一个命令中将输出显示到控制台?我很确定tee可以在这里使用类似的东西,但是我的大脑并没有按应有的方式工作。

否则,我想使用它写入临时文件和控制台tee并将cat其重新写入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

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

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

如果您tee将 find 命令的 stdout 输出到 stderr(此处通过匿名 fifo),您可以将 find 的输出打印到屏幕上。

如果你的文件名或路径嵌入了换行符,你的计数就会出错。因此,使用 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 回答