Come citare argomenti con xargs


15

Supponiamo di voler eliminare tutti i file in una cartella superiore a 1 MB.

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

Ciò non eliminerà i file che hanno spazio nei loro nomi. Quindi voglio che citi tutti gli argomenti a cui invia rm. Se lo findSome report.docxdovrebbe passare "Some report.docx"a rm.

Come posso fare ciò?


1
Dovresti leggere questo mywiki.wooledge.org/UsingFind?highlight=%28xargs%29 prima di fare qualsiasi cosa xargs. Inoltre, come suggerisce la wiki, non usare xargssenza passare -print0a find.
Valentin Bajrami,


Utilizzare xargs -d$'\n'per limitare il delimitatore solo alle nuove righe (e non agli spazi; questo non elabora specialmente le virgolette ecc. - Ho verificato su un sistema GNU) - la risposta fornita in stackoverflow.com/a/33528111/94687
imz - Ivan Zakharyaschev,

Risposte:


13

Uso semplice:

find . -size +1M -delete

Se insisti nell'utilizzare xargse rmcon find, aggiungi semplicemente il -print0tuo comando:

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

Altro modo:

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

Da 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.

2
Questo risolve il problema, ma in realtà citando gli argomenti sarebbe utile in altri casi. Quindi aspetterò per altre risposte. +1 per una soluzione semplice però.
Kshitiz Sharma,

2
@KshitizSharma No, non vuoi passare "Some report.docx"a rm, a meno che il nome del file non contenga le virgolette. Quello che vuoi è passare a non Some report.docxmolestato rm. La risposta di KasiyA (ora) mostra il modo generale per farlo find. [KasiyA: scusa per il ping sbagliato prima.]
Gilles 'SO- smetti di essere malvagio' il

@Gilles Correct. In bash in genere cito la stringa per passarla non molestata. Quindi citando ciò che intendevo era inviare il nome del file come singolo argomento a rm invece di essere diviso in $0ed $1ecc.
Kshitiz Sharma,

Su OSX lo faccio xargs -0invece di xargs -r0.
Rolf,

8

Opzione -0di xargssignifica che l'output dal pipe viene interpretato come articoli con terminazione null. In tal caso è anche necessario creare input per la pipe con find ... -print0.


5

Avevo un requisito simile e alla fine ho usato l' -Iinterruttore per avere un segnaposto e sono stato in grado di citarlo.

find . -size +1M | xargs -I {} rm "{}"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.