Como citar argumentos com xargs

15

Suponha que eu queira excluir todos os arquivos em uma pasta com mais de 1 MB.

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

Isso não excluirá os arquivos que possuem espaço em seus nomes. Então, eu quero que cite todos os argumentos para os quais envia rm. Se findder, Some report.docxdeve passar "Some report.docx"para rm.

Como eu posso fazer isso?

Kshitiz Sharma
fonte
1
Você deve ler este mywiki.wooledge.org/UsingFind?highlight=%28xargs%29 antes de fazer qualquer coisa xargs. Também como o wiki sugere, não use xargssem passar -print0para find.
Valentin Bajrami
Use xargs -d$'\n'para limitar o delimitador apenas a novas linhas (e não a espaços; isso não processará aspas etc., especialmente - verifiquei em um sistema GNU) - a resposta dada em stackoverflow.com/a/33528111/94687
imz - Ivan Zakharyaschev

Respostas:

13

Uso simples:

find . -size +1M -delete

Se você insistir em usar xargse rmcom find, basta adicionar -print0seu comando:

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

Outro jeito:

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

De 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нιη
fonte
2
Isso resolve o problema, mas citar os argumentos seria útil em outros casos. Então, eu vou esperar por outras respostas. +1 para uma solução simples.
Kshitiz Sharma
2
@KshitizSharma Não, você não quer passar "Some report.docx"para rma menos que o nome do arquivo contém as aspas. O que você quer é passar Some report.docxsem ser molestado rm. A resposta da KasiyA (agora) mostra a maneira geral de fazer isso find. [KasiyA: desculpe pelo ping errado antes.]
Gilles 'SO- stop be evil'
@Gilles Correct. Geralmente, no bash, cito a string para passar sem ser molestada. Então, citando que eu quis dizer foi enviar nome do arquivo como um único argumento para rm em vez de ser dividido em $0e $1etc.
Kshitiz Sharma
No OSX eu faço em xargs -0vez de xargs -r0.
Rolf
8

Opção -0de xargssignifica que a saída do tubo é interpretada como itens terminados nulos. Nesse caso, você também precisa criar entradas para o tubo find ... -print0.

jimmij
fonte
5

Eu tinha um requisito semelhante e acabei usando a -Iopção para ter um espaço reservado e pude citá-lo.

find . -size +1M | xargs -I {} rm "{}"
dee-see
fonte