Почти 10 лет назад я задал этот вопрос
рекурсивно использовать SED в Linux?
и получил эту полезную команду find . -type f -print0 | xargs -0 sed -i 's/regex_search_term/replace_term/g'
Я решил узнать больше о find
, xargs
и sed
заявление. В Ubuntu 18.04 в bash версии 4.4.20 (1) -release я могу упростить утверждение до следующего:
find . -type f -print | xargs sed -i 's/regex_search_term/replace_term/g'
Что затем можно снова упростить до следующего:
find . -type f | xargs sed -i 's/regex_search_term/replace_term/g'
Итак, мой вопрос: есть ли недостатки в том, чтобы не использовать -print0
флаг с -0
флаг find
и xargs
соответственно? И есть ли недостатки в отказе от -print
флаг вообще? Используются ли они явно для совместимости с разными unix-подобными системами?
Версии, которые не используют -print0
и xargs -0
вас смутит количество редких, но допустимых символов в именах файлов, включая пробелы, табуляции, новые строки, кавычки и обратную косую черту. Нулевой байт (символ ASCII NUL) - единственное, что не может встречаются в пути к файлу, поэтому использование его в качестве разделителя позволяет избежать этих потенциальных проблем.
Но есть способ попроще. Современные версии find
есть -exec ... +
первичный, который делает то же самое, что и xargs
, прямо в find
команда:
find . -type f -exec sed -i 's/regex_search_term/replace_term/g' {} +
У этого нет всех вариантов, которые xargs
есть, поэтому, если вам нужно что-то другое, кроме обычного collect-names-and-run-it, вы все равно должны использовать -print0 | xargs -0
.