От man xargs
xargs читает элементы из стандартного ввода, разделенные пробелами (которые могут быть защищены двойными или одинарными кавычками или обратной косой чертой) или символами новой строки, и выполняет команду (по умолчанию это / bin / echo) один или несколько раз с последующими начальными аргументами по элементам, прочитанным из стандартного ввода. Пустые строки на стандартном вводе игнорируются.
Мы можем (в основном) исправить вашу начальную команду, изменив разделитель xargs на новую строку:
ls | egrep '. ' | xargs -d '\n' rm
(не делай этого ... читай дальше)
Но что, если имя файла содержит новую строку?
touch "filename with blanks
and newline"
Поскольку имена файлов Unix могут содержать пробелы и символы новой строки , такое поведение по умолчанию часто проблематично; имена файлов, содержащие пробелы и / или символы новой строки, неправильно обрабатываются xargs. В этих ситуациях лучше использовать опцию -0 , которая предотвращает подобные проблемы.
ls
это действительно инструмент для непосредственного потребления человеком , вместо этого нам нужно использовать find
команду, которая может разделять имена файлов нулевым символом ( -print0
). Мы также должны указать grep использовать нулевые символы для разделения input ( -z
) и output ( -Z
). Наконец, мы говорим Xargs также использовать нулевые символы ( -0
)
find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm
echo
сначала, чтобы избежать опечаток. Добавьтеecho
спереди, и он распечатает все файлы, которые собирается удалить.