Следующая команда взята из https://www.tecmint.com/xargs-command-examples/ примера №9. Он предназначен для удаления файлов, не соответствующих * gz, из текущего каталога.
$ find . -type f -not -name '*gz' -print0 | xargs -0 -I {} rm -v {}
Какова цель аргументов -print0
команды find
и аргументов -0
и -I {}
аргументов ] xargs
команда? Зачем они нужны? Спасибо!
-print0
указывает find
выводить результаты, разделенные нулевыми байтами, вместо обычных символов новой строки. Это необходимо, если имена файлов содержат (или могут в будущем) содержать символы новой строки.
Затем вам нужно указать xargs
, чтобы по конвейеру поступали данные с разделителями-нулем - для этого и используется -0
. Это необходимо при использовании -print0
на LHS.
Между тем {}
- строка замены - когда вы используете -I {}
, каждое {}
в следующей команде будет заменено вводом элемент. Это действительно необходимо только тогда, когда вам нужно контролировать, где элемент появляется в следующей командной строке (и имеет побочный эффект выполнения одного вызова для каждого элемента, что эквивалентно добавлению -L 1
). IMHO в этом нет необходимости, и это делает решение неэффективным, поскольку оно запускает rm
один раз для каждого найденного файла, а не партиями.
Обратите внимание, что find
имеет параметр -exec
и параметр -delete
, что позволяет избежать проблемы записи / чтения данных с разделителями в целом:
find . -type f -not -name '*gz' -exec rm -v {} +
или
find . -type f -not -name '*gz' -print -delete
(здесь -принт
для предоставления аналогичных функций, как опция -v
для rm
).