Таким образом я делаю отпечатки пальцев для всех файлов в /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?





Попробуйте сделать это вместо этого:
find /var/www/html -type f | xargs -i md5sum | tee /opt/figerprint.db.ori 1>/dev/null
Из руководства xargs:
-I replace-str
Replace occurrences of replace-str in the initial-arguments with names read from standard input. Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.
Перенаправление 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
что, однако, будет довольно неэффективным, поскольку создает один процесс для каждого найденного файла.
Почему 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 никогда не работает нормально.