J'essaie de supprimer tous les fichiers avec un espace dans leurs noms. J'utilise la commande suivante. Mais ça me donne une erreur
Commande: ls | egrep '. ' | xargs rm
Ici, si j'utilise uniquement la ls | egrep '. '
commande, cela me donne tout le nom de fichier avec des espaces dans les noms de fichiers. Mais lorsque j'essaie de passer la sortie à rm, tous les espaces (en tête ou en fin) sont supprimés. Donc ma commande ne s'exécute pas correctement.
Des conseils sur la façon de supprimer le fichier ayant au moins un espace dans leur nom?
echo
première, pour vous protéger des fautes de frappe. Ajoutezecho
à l'avant et il imprimera tous les fichiers qu'il va supprimer.find
puissant, il n'est parfois pas nécessaire de tuer le poulet avec une mitrailleuse. Les administrateurs UNIX ne recourraient généralement pasfind
(par exemple) à "supprimer tous les fichiers commençant par la lettre A" ... un serait tout simplementrm A*
. De même, pour supprimer les fichiers contenant des espaces, rm peut faire le travail. En d'autres termes, ne vous laissez pas berner car l'espace est invisible et est traité spécialement par la coque. Échappez-vous simplement à lui, comme l'a fait Stephen Kitt, et vous pouvez y penser comme n'importe quel autre personnage.J'éviterais d'analyser la
ls
sortiePourquoi pas :
Pas de problème avec
rm
:-).Bien que cela soit récursif et supprimera tous les fichiers avec de l'espace dans le répertoire actuel et les répertoires imbriqués, comme mentionné dans les commentaires.
la source
-name '* *'
place de l'expression régulière; et (2) vous pouvez utiliser-print0 | xargs -0 rm -i
pour répondre aux préoccupations de @ StephenKitt.xargs
. Il suffit d'utiliser-exec rm -i '{}' +
find . -maxdepth 1 -name '* *' -delete
.Regardez ce nom supposé "fichier étrange"
Solution un
solution deux
solution trois
vous voyez alors l'inode
En cas de noms de fichiers très étranges comme
utilisation
la source
De
man xargs
Nous pouvons (principalement) corriger votre commande initiale en changeant le délimiteur xargs en une nouvelle ligne:
ls | egrep '. ' | xargs -d '\n' rm
(ne faites pas ça ... lisez la suite)Mais que faire si le nom de fichier contient une nouvelle ligne?
touch "filename with blanks and newline"
ls
est vraiment un outil de consommation directe par un humain , nous devons plutôt utiliser lafind
commande qui peut séparer les noms de fichiers avec un caractère nul (-print0
). Nous devons également dire à grep d'utiliser des caractères nuls pour séparer l'entrée (-z
) et la sortie (-Z
). Enfin, nous demandons à xargs d'utiliser également des caractères nuls (-0
)find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm
la source
Vous pouvez utiliser:
la source
Pour ce faire, vous aurez besoin de l'
-Z
option grep et de l'-0
option xargs. Mais je ne le ferais pas de cette façon (cels
n'est pas le bon outil pour le travail, il y a beaucoup de problèmes pour que l'ordinateur lise sa sortie).Voir d'autres réponses pour une meilleure façon.
Également
ls | …
est équivalent àls -d *
etecho * | …
Qui ont tous des problèmes. Par conséquent, n'utilisez pas
ls
comme ça, utilisez une solution d'une autre réponse.la source
ls *
lorsque les canaux sortent les noms de fichiers délimités par des sauts de ligne.echo
(au moins certainesecho
implémentations) étend les séquences de barre oblique inverse.grep -Z
sert à écrire des noms de fichiers délimités NUL lors de l'utilisation-l
, cela n'aidera pas ici. Si vous vouliez dire-z
, cela n'aidera pas non plus car la plupart desls
implémentations n'ont pas d'option pour sortir les noms de fichiers délimités NUL. On pourrait faire quelque chose comme çaprintf '%s\0' * | grep -z ' ' | xargs -r0 rm -f
cependant.