为什么不能将 tee 命令的 stdout 重定向到 /dev/null



我用这种方式为/var/www/html中的所有文件制作指纹。

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

它运行良好。

现在,我想将所有stdout of 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?

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

错误的原因是您正在将未引用的文件名传递给md5sum。GNUfind的一个常见解决方法是使用零字节终止符而不是换行符:

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,用于在find找不到任何文件时阻止md5sum运行。

错误消息表明您可能没有GNUfind。另一种实现相同目的的方法是

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

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

试着这样做:

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

来自xargs的手册:

-I替换str

将初始参数中出现的Replace str替换为从标准输入中读取的名称。此外,未加引号的空格不会终止输入项;相反,分隔符是换行符。隐含-x和-L1.

为什么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

默认情况下,相关的错误信息不能写入文件(tee的字符(。

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

最新更新