Удалить файлы, не соответствующие шаблону, с помощью xargs

Следующая команда взята из 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 команда? Зачем они нужны? Спасибо!

2
задан 2 August 2021 в 13:10

1 ответ

-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 ).

4
ответ дан 20 August 2021 в 10:30

Другие вопросы по тегам:

Похожие вопросы: