Как процитировать аргументы с помощью 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.
αғsнιη
источник
2
Это решает проблему, но на самом деле цитирование аргументов было бы полезно в других случаях. Так что я буду держаться за другие ответы. +1 за простое решение, хотя.
Кшитиз Шарма
2
@KshitizSharma Нет, вы не хотите , чтобы перейти "Some report.docx"к rm, если имя файла не содержит кавычки. То, что вы хотите, это передать Some report.docxбеспрепятственный rm. Ответ KasiyA (сейчас) показывает общий способ сделать это с find. [KasiyA: извините за неправильный пинг ранее.]
Жиль "ТАК - перестань быть злым"
@ Жиль Правильно. В bash я обычно цитирую строку, чтобы передать ее без изменений. Таким образом, цитируя то, что я имел в виду, было посылать имя файла в качестве единственного аргумента в rm, а не делиться на $0и $1т. Д.
Kshitiz Sharma
На OSX я делаю xargs -0вместо xargs -r0.
Рольф
8

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

jimmij
источник
5

У меня было похожее требование, и в итоге я использовал -Iпереключатель, чтобы получить заполнитель, и я смог его процитировать.

find . -size +1M | xargs -I {} rm "{}"
Ди-см
источник