Выбор ответа Middle grep, sed, awk, find, xargs спрашивают часто обновлено

xargs и пробелы в именах

Вопрос

Команда find . -name '*.tmp' | xargs rm упала на файле old report.tmp. Почему и как правильно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: xargs делит по пробелам; нужно -print0 xargs -0 rm. xargs без -0 разбивает ввод по пробельным символам (и ещё обрабатывает кавычки), поэтому old report.tmp превращается в old и report.tmp. -print0 разделяет имена нулевым байтом, которого не бывает в путях, а xargs -0 разбирает именно так.

Варианты ответа

  1. rm не умеет удалять файлы с пробелами, нужен unlink
  2. xargs делит по пробелам; нужно -print0 | xargs -0 rmправильный ответ
  3. Нужно взять команду в кавычки: xargs "rm"
  4. Нужно добавить xargs -n1, чтобы передавать по одному

Разбор

xargs без -0 разбивает ввод по пробельным символам (и ещё обрабатывает кавычки), поэтому old report.tmp превращается в old и report.tmp. -print0 разделяет имена нулевым байтом, которого не бывает в путях, а xargs -0 разбирает именно так. Ещё проще: find . -name '*.tmp' -delete. -n1 не помогает: разбиение по пробелам остаётся.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.