12 votes

suppression des dossiers avec des espaces dans leurs noms en utilisant xargs

Pourquoi xargs ne peut pas supprimer les répertoires avec des espaces dans leurs noms, et comment corriger cela ?

76 find . -type d |xargs  rm -rf
 77 rm -rf fire\ hydrant/
 78 rm -rf wine\ glass/
 79 rm -rf tennis\ racket/
 80 rm -rf traffic\ light/
 81 rm -rf parking\ meter/
 82 rm -rf teddy\ bear/
 83 rm -rf sports\ ball/
 84 rm -rf cell\ phone/
 85 rm -rf stop\ sign/
 86 rm -rf dining\ table/
 87 rm -rf potted\ plant/

24voto

Zanna Points 65764

Réparez-le en utilisant -print0 sur find y xargs -0 sur xargs pour indiquer aux deux commandes d'utiliser le caractère NULL comme séparateur au lieu de l'espace :

find . -type d -print0 | xargs -0 rm -rf

Voici une bonne explication de la raison pour laquelle il est cassé et de la façon dont ce correctif fonctionne. La ligne de commande Linux par William E. Shotts Jr .

Traiter les noms de fichiers amusants

Les systèmes de type Unix autorisent les espaces incorporés (et même les retours à la ligne !) dans les noms de fichiers. Cela pose des problèmes aux programmes comme xargs qui construisent des listes d'arguments pour d'autres programmes. Un espace intégré à espace intégré sera traité comme un délimiteur, et la commande résultante interprétera chaque mot séparé par un espace comme un mot à part entière. résultante interprétera chaque mot séparé par un espace comme un distinct. Pour surmonter ce problème, find et xarg permettent l'utilisation facultative d'un caractère nul comme séparateur d'arguments. caractère nul comme séparateur d'argument. Un caractère nul est défini en ASCII comme étant le caractère représenté par le chiffre zéro (par opposition à au caractère espace, par exemple, qui est défini en ASCII comme le caractère caractère représenté par le chiffre 32). La commande find fournit l'action action -print0, qui produit une sortie séparée par un caractère nul, et la commande xargs dispose de l'option --null, qui accepte les entrées séparées par un caractère nul. Voici un exemple :

find ~ -iname '*.jpg' -print0 | xargs --null ls -l

En utilisant cette technique, nous pouvons nous assurer que tous les fichiers, même ceux contenant des espaces intégrés dans leurs noms, sont traités correctement.

( -0 est la version courte de la --null option)

17voto

heemayl Points 85741

Vous n'avez pas besoin xargs , find elle-même peut le faire de manière robuste avec la manipulation :

  • tout type de nom de fichier possible

  • sans déclencher ARG_MAX

Si les répertoires sont vides, utilisez -delete action :

find . -type d -delete

S'il n'est pas vide, utilisez rm -r において -exec action :

find . -type d -exec rm -r {} +

Si vous insistez pour utiliser xargs pour tous les noms de répertoires qui ne contiennent pas de ligne nouvelle, vous pouvez utiliser la ligne nouvelle comme délimiteur des arguments entrants :

find . -type d | xargs -d $'\n' rm -r

La meilleure façon de procéder est de séparer les fichiers par des NULs et de les gérer avec -0 option de xargs :

find . -type d -name 'foo bar*' -print0 | xargs -0 rm -r

Pour tous les rm -r utilisé, ajouter -f c'est-à-dire faire rm -rf si nécessaire.

2voto

pellea72 Points 323

Pour supprimer spécifiquement tous les sous-répertoires ayant des espaces dans leur nom, la commande la plus simple serait :

find . -type d -name "* *" -exec rm -rf {} +

C'est la même approche que celle qu'heemayl a déjà suggérée, la seule différence étant le -name filtrage.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X