Назад | Перейти на главную страницу

Удаление флагов -print0 и -0 из find и xargs

Почти 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.