Le piping find -name vers xargs entraîne des noms de fichiers avec des espaces non transmis à la commande

26

Normalement, pour supprimer des fichiers avec des espaces dans leur nom de fichier, vous devez exécuter:

$ rm "file name"

mais si je veux supprimer plusieurs fichiers, par exemple:

$ find . -name "*.txt" | xargs rm

Cela ne supprimera pas les fichiers contenant des espaces.

Ashley
la source
Devinez ici: find -name "*\ *.txt" | xargs rmfonctionne pour les fichiers de deux mots?
TheWanderer

Réponses:

49

Vous pouvez dire findet xargsutiliser les deux terminateurs null

find . -name "*.txt" -print0 | xargs -0 rm

ou (plus simple) utiliser l' -deleteaction intégrée defind

find . -name "*.txt" -delete

ou (merci @kos)

find . -name "*.txt" -exec rm {} +

l'un ou l'autre devrait respecter la ARG_MAXlimite du système sans qu'il soit nécessaire de le faire xargs.

tournevis
la source
1
Je ne peux pas voter deux fois dur :) puisque vous l'avez mentionné, ARG_MAXje mentionnerai également que ce find . -name "*.txt" -exec rm {} \;serait un "coup sûr"
kos
3
Ainsi dit le maître: souvenez-vous toujours de xargs -0.
Joshua
1
Point super important: -print0doit être la dernière option (ou au moins après -name "*.txt") sinon cela frappera les fichiers qui ne sont plus limités à*.txt ...
Kev
1

Par ailleurs, si vous avez utilisé autre chose que find, vous pouvez utiliser tr pour remplacer les sauts de ligne par des octets nuls.

Par exemple. la ligne suivante supprime les 10 derniers fichiers modifiés dans un répertoire, même s'ils ont des espaces dans leurs noms.

ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm

Ibrahim
la source
Oui, cela fonctionne.
Peter Mortensen
0

La commande xargs utilise des tabulations, des espaces et de nouvelles lignes comme délimiteurs par défaut. Vous pouvez lui dire de n'utiliser que des caractères de nouvelle ligne ('\ n') avec l'option -d:

find . -name "*.txt" | xargs -d '\n' rm

Source réponse sur SO .

joseph_morris
la source
Cette réponse mentionne -0au lieu de -d(pour xargs) pour les systèmes BSD. Qu'est-ce qu'Ubuntu utilise? La réponse acceptée ici utilise -0. Qu'est-ce qui est correct?
Peter Mortensen