С точки зрения xargs
, вы можете использовать -r
, как предлагается, однако это не поддерживается BSD xargs
.
Так что в качестве обходного пути вы можете передать некоторый дополнительный временный файл, например:
find /mydir -type f -name "*.txt" -print0 | xargs -0 chown root $(mktemp)
или перенаправить его stderr в ноль (2> /dev/null
), например,
find /mydir -type f -name "*.txt" -print0 | xargs -0 chown root 2> /dev/null || true
Другой лучший подход - перебирать найденные файлы, используя цикл while
:
find /mydir -type f -name "*.txt" -print0 | while IFS= read -r -d '' file; do
chown -v root "$file"
done
См. Также: Игнорировать пустые результаты для xargs в Mac OS X
Также обратите внимание, что ваш способ изменения разрешений не очень хорош и не рекомендуется. Определенно, вы не должны анализировать вывод команды ls
(см .: Почему вы не должны анализировать вывод команды ls ). Особенно, когда вы запускаете команду от имени пользователя root, поскольку ваши файлы могут состоять из специальных символов, которые могут интерпретироваться оболочкой или представлять файл с пробелом около /
, тогда результаты могут быть ужасными.
Поэтому вы должны изменить свой подход и использовать вместо него команду find
, например,
find /mydir -type f -name "*.txt" -execdir chown root {} ';'