Wie man Argumente mit xargs zitiert

15

Angenommen, ich möchte alle Dateien in einem Ordner löschen, die größer als 1 MB sind.

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

Dadurch werden keine Dateien gelöscht, deren Namen Leerzeichen enthalten. Ich möchte, dass es alle Argumente zitiert, an die es sendet rm. Wenn findes gibt Some report.docxsollte es passieren "Some report.docx"zu rm.

Wie kann ich das machen?

Kshitiz Sharma
quelle
1
Sie sollten mywiki.wooledge.org/UsingFind?highlight=%28xargs%29 lesen, bevor Sie etwas unternehmen xargs. Auch als das Wiki schlägt vor, verwenden Sie nicht xargsohne Umweg -print0zu find.
Valentin Bajrami
1
Weitere Informationen finden Sie unter Warum verschluckt sich mein Shell-Skript an Leerzeichen oder anderen Sonderzeichen?
Gilles 'SO- hör auf böse zu sein'
Verwenden Sie xargs -d$'\n'das Trennzeichen , um nur neue Zeilen zu begrenzen (und keine Leerzeichen, dies würde nicht Anführungszeichen usw. verarbeitet speziell - ich auf einem GNU - System überprüft habe) - die Antwort in bestimmten stackoverflow.com/a/33528111/94687
imz - Ivan Zakharyaschev

Antworten:

13

Einfache Bedienung:

find . -size +1M -delete

Wenn Sie darauf bestehen, xargsund rmmit zu verwenden find, fügen -print0Sie einfach Ihren Befehl hinzu:

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

Andere Weise:

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

Von 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нιη
quelle
2
Dies löst das Problem, aber das tatsächliche Zitieren der Argumente wäre in anderen Fällen nützlich. Also werde ich für andere Antworten festhalten. +1 für eine einfache Lösung.
Kshitiz Sharma
2
@KshitizSharma Nein, Sie wollen nicht passieren "Some report.docx"zu rm, es sei denn , der Dateiname , die Anführungszeichen enthält. Was Sie wollen, ist Some report.docxunbehelligt weiterzugeben rm. Die Antwort von KasiyA zeigt (jetzt), wie man das generell macht find. [KasiyA: Entschuldigung für den falschen Ping früher.]
Gilles 'SO- hör auf, böse zu sein'
@ Gilles Richtig. In Bash zitiere ich die Zeichenfolge im Allgemeinen, um sie ungestört weiterzugeben. Also, indem ich zitierte, was ich meinte, war, Dateinamen als einzelnes Argument an rm zu senden, anstatt in $0und $1etc. aufgeteilt zu werden
Kshitiz Sharma
Unter OSX tue ich xargs -0statt xargs -r0.
Rolf
8

Option -0von xargsbedeutet, dass die Ausgabe von Pipe als nullterminierte Elemente interpretiert wird. In diesem Fall müssen Sie auch eine Eingabe für die Pipe mit erstellen find ... -print0.

jimmij
quelle
5

Ich hatte eine ähnliche Anforderung und benutzte den -ISchalter, um einen Platzhalter zu haben, und ich konnte ihn zitieren.

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