Почему нельзя перенаправить стандартный вывод команды tee в / dev / null - PullRequest
0 голосов
/ 15 ноября 2018

Я делаю отпечаток пальца для всех файлов в /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

Как исправить мою команду, чтобы правильно перенаправить стандартный вывод в / dev / null?

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Ваше перенаправление stdout работает нормально и не связано с сообщением об ошибке, которое вы получаете (в любом случае это стандартная ошибка, а не стандартный вывод. Если вы хотите сбросить stderr, это 2>/dev/null).

Причина ошибки заключается в том, что вы передаете имена файлов без кавычек в 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

, что, однако, будет довольно неэффективно, поскольку создает один процесс для каждого найденного файла.

0 голосов
/ 16 ноября 2018

Почему 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

Информация об ошибке не может быть записана в файл по умолчанию (символ тройника).

find /var/www/html -type f |xargs md5sum | tee /opt/figerprint.db.ori никогда не работает нормально.

0 голосов
/ 15 ноября 2018

Попробуйте сделать это вместо:

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

Из руководства xargs:

-I replace-str

Заменить вхождения replace-str в initial-arguments именами, считанными из стандартного ввода. Кроме того, пробелы без кавычек не заканчивают элементы ввода; вместо этого разделителем является символ перевода строки. Подразумевает -x и -L 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...