Як цитувати аргументи з xargs


15

Припустимо, я хочу видалити всі файли в папці, що перевищує 1 Мб.

$ find . -size +1M | xargs -0 rm

Це не видалить файли, у яких є простір у їх іменах. Тому я хочу, щоб він цитував усі аргументи, які він надсилає rm. Якщо findдає йому Some report.docxце повинно пройти "Some report.docx"до rm.

Як я можу це зробити?


1
Ви повинні прочитати це mywiki.wooledge.org/UsingFind?highlight=%28xargs%29, перш ніж робити щось із цим xargs. Крім того, як пропонує вікі, не використовуйте, xargsне передаючи -print0до find.
Валентин Байрамі


Використовуйте xargs -d$'\n'для обмеження роздільника лише новими рядками (а не пробілами; це не обробляє лапки тощо. Спеціально - я перевірив систему GNU) - відповідь, наведена в stackoverflow.com/a/33528111/94687
imz - Іван Захарящев

Відповіді:


13

Просте використання:

find . -size +1M -delete

Якщо ви наполягаєте на використанні xargsта rmз find, просто додайте -print0у свою команду:

find . -size +1M -print0 | xargs -r0 rm --

Інший шлях:

find . -size +1M -execdir rm -- {} +

Від man find:

-print0
    True; print the full file name on the standard output, followed by a null 
character (instead of the newline character that -print uses). This allows file names 
that contain newlines or other types of white space to be correctly interpreted by 
programs that process the find output. This option corresponds to the -0 option of 
xargs.

3
Це вирішує проблему, але фактично цитування аргументів було б корисно в інших випадках. Тож я буду тримати інші відповіді. Хоча +1 для простого рішення.
Кшитіт Шарма

2
@KshitizSharma Ні, ви не хочете , щоб перейти "Some report.docx"до rm, якщо ім'я файлу не містить лапки. Те, що ви хочете, - це пройти Some report.docxнепогано rm. Відповідь Касії (зараз) показує загальний спосіб зробити це find. [KasiyA: Вибачте за неправильний пінг раніше.]
перестань бути злим"

@Gilles Правильно. В bash я, як правило, цитую рядок, щоб передати його безперешкодно. Отже, цитуючи те, що я мав на увазі, було надіслати ім'я файлу як єдиний аргумент до rm, а не розбиватися на $0і $1т. Д.
Kshitiz Sharma

На OSX я це роблю xargs -0замість xargs -r0.
Рольф

8

Варіант -0з xargsкоштів , які виводять з труби інтерпретуються як нуль елементів. У такому випадку вам також потрібно створити вхід для труби find ... -print0.


6

У мене була аналогічна вимога, і я в кінцевому підсумку використовував -Iперемикач, щоб мати заповнювач, і я зміг його процитувати.

find . -size +1M | xargs -I {} rm "{}"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.