З 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, щоб використовувати нульові символи, щоб розділити вхід ( -z
) і вихід ( -Z
). Нарешті, ми кажемо xargs також використовувати нульові символи ( -0
)
find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm
echo
перше, щоб уберегтися від помилок. Додайтеecho
спереду, і він виведе всі файли, які збирається видалити.