Comment citer des arguments avec xargs


15

Supposons que je souhaite supprimer tous les fichiers d'un dossier dont la taille est supérieure à 1 Mo.

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

Cela ne supprimera pas les fichiers qui ont de l'espace dans leurs noms. Je veux donc qu'il cite tous les arguments qu'il envoie rm. Si le finddonne, Some report.docxil devrait passer "Some report.docx"à rm.

Comment puis je faire ça?


1
Vous devriez lire ce mywiki.wooledge.org/UsingFind?highlight=%28xargs%29 avant de faire quoi que ce soit avec xargs. Aussi comme le suggère le wiki, n'utilisez pas xargssans passer -print0à find.
Valentin Bajrami


Utilisez xargs -d$'\n'pour limiter le délimiteur à seulement de nouvelles lignes (et non des espaces; cela ne traiterait pas spécialement les guillemets, etc. - j'ai vérifié sur un système GNU) - la réponse donnée dans stackoverflow.com/a/33528111/94687
imz - Ivan Zakharyaschev

Réponses:


13

Utilisation simple:

find . -size +1M -delete

Si vous insistez pour utiliser xargset rmavec find, ajoutez simplement -print0votre commande:

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

Autre moyen:

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.

2
Cela résout le problème, mais en fait, citer les arguments serait utile dans d'autres cas. Je vais donc attendre d'autres réponses. +1 pour une solution simple.
Kshitiz Sharma

2
@KshitizSharma Non, vous ne voulez pas passer "Some report.docx"à rm, sauf si le nom de fichier contient les guillemets. Ce que vous voulez, c'est passer Some report.docxsans être inquiété rm. La réponse de KasiyA (maintenant) montre la manière générale de le faire avec find. [KasiyA: désolé pour le mauvais ping plus tôt.]
Gilles 'SO- arrête d'être méchant'

@Gilles Correct. En bash, je cite généralement la chaîne pour la passer sans encombre. Donc, en citant ce que je voulais dire, c'était d'envoyer le nom de fichier en tant qu'argument unique à rm au lieu d'être divisé en $0et $1etc.
Kshitiz Sharma

Sur OSX, je fais xargs -0au lieu de xargs -r0.
Rolf

8

Option -0de xargssignifie que la sortie du tuyau est interprétée comme des éléments terminés par des valeurs nulles. Dans ce cas, vous devez également créer une entrée pour le tuyau avec find ... -print0.


5

J'avais une exigence similaire et j'ai fini par utiliser le -Icommutateur pour avoir un espace réservé et j'ai pu le citer.

find . -size +1M | xargs -I {} rm "{}"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.