为什么不能将tee命令的标准输出重定向到/ dev / null

时间:2018-11-15 06:29:06

标签: bash redirect

我以此方式为/var/www/html中的所有文件制作指纹。

find /var/www/html  -type  f |xargs md5sum | tee /opt/figerprint.db.ori  

它工作正常。

现在,我要将tee命令的所有标准输出重定向到/ dev / null。

find /var/www/html  -type  f |xargs md5sum | tee /opt/figerprint.db.ori  1>/dev/null

md5sum: /var/www/html/news/uploads/Red: No such file or directory
md5sum: Hat: No such file or directory
md5sum: Enterprise: No such file or directory
md5sum: Linux: No such file or directory
md5sum: 6.txt: No such file or directory

我发现该文件名无法正确解析。

ls /var/www/html/news/uploads/Red*
/var/www/html/news/uploads/Red Hat Enterprise Linux 6.txt

如何修复我的命令以将stdout正确重定向到/ dev / null?

3 个答案:

答案 0 :(得分:2)

您的stdout重定向工作正常,并且与您收到的错误消息无关(无论如何,这是标准错误,而不是标准输出。如果要丢弃2>/dev/null的stderr)。

该错误的原因是您将未加引号的文件名传递给md5sum。 GNU find的常见解决方法是使用零字节终止符代替换行符:

find /var/www/html -type f -print0 | 
xargs -0 md5sum |
tee /opt/figerprint.db.ori >/dev/null

当然,如果您丢弃标准输出,则无需tee

find /var/www/html -type  f -print0 | 
xargs -0 md5sum >/opt/figerprint.db.ori

常见的添加方式是xargs -r,以防止md5sum找不到任何文件时根本无法运行find

错误消息表明您可能没有拥有GNU find。完成同一件事的另一种方法是

find /var/www/html -type f -exec md5sum {} + >/opt/figerprint.db.ori

如果您的find确实很古老并且不支持-exec ... +,则需要切换到

find /var/www/html -type f -exec md5sum {} \; >/opt/figerprint.db.ori

这将是相当低效的,因为它会为找到的每个文件创建一个进程。

答案 1 :(得分:0)

尝试执行以下操作:

find /var/www/html -type  f | xargs -i md5sum | tee /opt/figerprint.db.ori  1>/dev/null

摘自xargs的手册:

  

-我 replace-str

     

用从标准输入中读取的名称替换初始参数中的replace-str出现。同样,未加引号的空格也不会终止输入项目。相反,分隔符是换行符。表示-x和-L                 1。

答案 2 :(得分:0)

为什么find /var/www/html -type f |xargs md5sum | tee /opt/figerprint.db.ori无法显示错误信息?

find /var/www/html  -type  f |xargs md5sum
md5sum: /var/www/html/news/uploads/Red: No such file or directory
md5sum: Hat: No such file or directory
md5sum: Enterprise: No such file or directory
md5sum: Linux: No such file or directory
md5sum: 6.txt: No such file or directory

tee将在屏幕上同时显示stdout和stderr,但默认情况下仅写入stdout信息。

find /var/www/html  -type  f |xargs md5sum | tee /opt/figerprint.db.ori

我在屏幕上浏览了以上命令的输出,

md5sum: /var/www/html/news/uploads/Red: No such file or directory
md5sum: Hat: No such file or directory
md5sum: Enterprise: No such file or directory
md5sum: Linux: No such file or directory
md5sum: 6.txt: No such file or directory

上面的行(称为相关错误信息)被许多其他行如

包围
b61b25303be0f573a6b9446d5cbe3a5b  /var/www/html/index.php

相关错误信息默认情况下无法写入文件(T型字符)。

find /var/www/html -type f |xargs md5sum | tee /opt/figerprint.db.ori永远无法正常工作。