web-dev-qa-db-fra.com

Piping find -name vers xargs donne des noms de fichiers avec des espaces non passés à la commande

Normalement, pour supprimer les 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.

26
Ashley

Vous pouvez indiquer findet xargsaux deux utiliser des terminateurs nuls.

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

ou (plus simple) utilisez l'action -delete intégrée de findname__

find . -name "*.txt" -delete

ou (merci @kos)

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

chacun d'eux doit respecter la limite ARG_MAX du système sans avoir besoin de xargsname__.

48
steeldriver

Incidemment, si vous avez utilisé autre chose que find, vous pouvez utiliser tr pour remplacer les nouvelles lignes par des octets nuls.

Par exemple. le liner suivant supprime les 10 derniers fichiers modifiés d’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

1
Ibrahim

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

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

réponse source sur SO .

0
joseph_morris