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.


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.


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


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 .


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