Cómo citar argumentos con xargs

15

Supongamos que quiero eliminar todos los archivos de una carpeta que tengan más de 1 MB.

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

Esto no eliminará archivos que tengan espacio en sus nombres. Entonces quiero que cite todos los argumentos que envía rm. Si lo findda, Some report.docxdebería pasar "Some report.docx"a rm.

¿Cómo puedo hacer eso?

Kshitiz Sharma
fuente
1
Debería leer esto mywiki.wooledge.org/UsingFind?highlight=%28xargs%29 antes de hacer algo con xargs. Además, como sugiere el wiki, no lo use xargssin pasar el -print0a find.
Valentin Bajrami
1
En términos más generales, vea ¿Por qué mi script de shell se ahoga en espacios en blanco u otros caracteres especiales?
Gilles 'SO- deja de ser malvado'
Úselo xargs -d$'\n'para limitar el delimitador a solo nuevas líneas (y no espacios; esto no procesaría comillas, etc. especialmente - He comprobado en un sistema GNU) - la respuesta dada en stackoverflow.com/a/33528111/94687
imz - Ivan Zakharyaschev

Respuestas:

13

Uso simple:

find . -size +1M -delete

Si insiste en usar xargsy rmcon find, simplemente agregue -print0su comando:

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

Otra manera:

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нιη
fuente
2
Esto resuelve el problema, pero en realidad sería útil citar los argumentos en otros casos. Así que esperaré por otras respuestas. Sin embargo, +1 para una solución simple.
Kshitiz Sharma
2
@KshitizSharma No, no desea pasar "Some report.docx"a rmmenos que el nombre del archivo contenga las comillas. Lo que quieres es pasar Some report.docxsin ser molestado rm. La respuesta de KasiyA (ahora) muestra la forma general de hacerlo find. [KasiyA: perdón por el ping equivocado antes.]
Gilles 'SO- deja de ser malvado'
@Gilles Correcto. En bash, generalmente cito la cadena para pasarla sin molestar. Así, citando lo que quería decir era enviar nombre de archivo como un solo argumento a rm en lugar de estar dividido en $0y $1etc
Kshitiz Sharma
En OSX lo hago en xargs -0lugar de xargs -r0.
Rolf
8

La opción -0de xargssignifica que la salida de la tubería se interpreta como elementos terminados en nulo. En tal caso, también debe crear una entrada para la tubería con find ... -print0.

jimmij
fuente
5

Tenía un requisito similar y terminé usando el -Iinterruptor para tener un marcador de posición y pude citarlo.

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