J'essaie de supprimer un tas de fichiers dans un certain répertoire (sur Mac OS X en utilisant Terminal)
ls | grep \([1-9]\) | xargs rm
devrait faire l'affaire, mais ce n'est pas le cas. J'essaie de supprimer n'importe quel fichier avec un seul chiffre entre parenthèses dans le nom de fichier (doublons téléchargés à partir du Web), mais cela finit par faire quelque chose comme ceci:
> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory
car il n'interprète pas correctement l'espace. Il devrait supprimer "520syllabus2010 (3) .pdf"
Quelle est la bonne façon de procéder?
Merci, Jeff
#
.#
.(3)
. Il est préférable de citer des arguments pour que le shell ne les affecte pas.Réponses:
Version courte:
Ne pas diriger
ls
versxargs
. Au lieu de cela, dirigez-vousfind ... -print0
versxargs -0
, afin d'éviter de tels problèmes.... qui peut s'écrire:
et:
qui peut encore être raccourci
rm
avec un caractère générique.Normalement,
ls
etfind
séparez les noms de fichiers par des retours à la ligne, maisxargs
divisez son entrée par un retour à la ligne ou un espace, ce qui entraîne le comportement que vous voyez.Il est possible de dire
xargs
de diviser uniquement par nouvelle ligne, mais les fichiers peuvent également avoir des nouvelles lignes dans leurs noms. En fait, sous Linux et BSD, le seul caractère interdit est le "nul" ou zéro octet - c'est donc ce que vous devez utiliser dans de tels cas.Dans l'exemple 2 ci-dessus,
-print0
indiquefind
de séparer les noms de fichiers avec un octet nul; pareil pourxargs -0
. (Quelques autres outils ont également des options similaires, commesort -z
ougrep -zZ
.)La «version courte» utilise un simple caractère générique de shell («modèle» dans le
bash
manuel - voir la section «Expansion du nom de chemin»).la source
*" "\\([1-9]\\).*
afin que seuls les fichiers avec un espace avant le numéro de parent avant la période (a, pour être juste) soient supprimés.