2009-09-30 13 views

Répondre

30

Essayez ceci (cela fonctionne dans le vieux Bourne sh plaine aussi bien):

for i in *000.tga 
do 
    mv "$i" "`echo $i | sed 's/000//'`" 
done 

Les deux arguments sont entre guillemets doubles pour soutenir espaces les noms de fichiers.

+0

+1 pour la plupart des solutions portables (et parce que je cours trop bas sur les upvotes pour continuer à upvoting _all_ les bonnes réponses). –

33

Bash peut faire sed -comme substitutions:

for file in *; do mv "${file}" "${file/000/}"; done 
+0

fonctionne bien sur OS X (10.6.8). Pratique et succinct. Merci. – jamesnotjim

+0

Nice, pouvez-vous expliquer la fonction de "{"? – efrem

+0

@efrem: Les accolades sont un délimiteur facultatif pour les noms de variables et sont nécessaires pour les extensions de paramètres. Voir le [Bash Manual] (https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion) pour plus d'informations. –

8

Une solution non bash, car je sais que deux affiches rapides ont déjà couvert que:

Il y a un excellent programme Perl court appelé rename qui est installé par défaut sur certains systèmes (d'autres ont un programme de changement de nom moins utile) . Il vous permet d'utiliser regex perl pour votre changement de nom, par exemple:

rename 's/000//' *000*.tga 
4
#!/bin/bash 
ls | while read name; do 
    echo mv $name ${name/$1//} 
done 
+1

+1: J'aime le '| tandis que read' construire. – Cascabel

+3

Comment "ls | while read name" est-il meilleur que "name" dans * "? –

+0

@Laurence Gonsalves: à l'aide de caractères génériques shell développez la ligne de commande, et il y a une limite pas si grande là-bas. "while read" évite que – Javier

Questions connexes