Comment puis-je renommer un grand nombre de fichiers à l'aide d'une expression régulière?

20

Je veux renommer beaucoup de fichiers sur Mac OS X (10.7.2) .. Je n'ai pas le paquet perl pour la renamecommande.

Mes fichiers ont des noms comme "T452-102456-0.png" et je veux supprimer la partie "-0". Je sais que je peux faire cette action en écrivant mon propre script php-cli, mais je voudrais connaître une solution plus simple et plus rapide.

Raphaël
la source
N'y a-t-il pas une contradiction logique entre «beaucoup de fichiers pdf» et «Mes fichiers ont des noms comme« T452-102456-0.png »»?
manatwork
Oh ... le type de fichiers n'a pas d'importance, mais c'est vrai ^^. Je retouche, merci pour ton commentaire =)
Raphaël

Réponses:

21

Bash ou Ksh avec mvpourrait le résoudre:

for f in *.png; do mv -n "$f" "${f/-0}"; done

Dans le cas où le nom du fichier peut avoir «0» après le premier tiret et que le «-0» est toujours devant le point, vous pouvez également inclure ce point dans l'expression:

for f in *.png; do mv -n "$f" "${f/-0./.}"; done

Mais comme cette règle de changement de nom est simple, si vous l'avez renamedans le paquet util-linux , cela le fera aussi:

rename '-0.' '.' *.png
homme au travail
la source
cela fonctionne parfaitement. Merci beaucoup =)
Raphaël
3

Méthode simple: fichiers dans le répertoire actuel uniquement

Avec zsh:

autoload zmv
zmv '(*)-0(.png)' '$1$2'

Avec d'autres coquilles:

for x in *-0.png; do mv -- "$x" "${x%-0.*}.png"; done


Méthode améliorée: fichiers dans le répertoire et / ou les sous-répertoires actuels

Avec zsh:

zmv '(**/)(*)-0(.png)' '$1$2$3'

Avec ksh93:

set -o globstar
for x in **/*-0.png; do mv -- "$x" "${x%-0.*}.png"; done

Avec bash ≥4, comme ci-dessus, mais utilisez à la shopt -s globstarplace de la setcommande.

Avec d'autres coquilles:

find -name '*-0.png' -exec sh -c 'for x; do mv -- "$x" "${x%-0.*}.png"; done' _ {} +
Gilles 'SO- arrête d'être méchant'
la source
une autre bonne raison d'installer zsh:) .... zmv
danidee
2

Dans Fish Shell sur OSX:

for f in *.png; mv -n $f (basename $f -0.png).png; end

Coquille de poisson: https://fishshell.com/

jeffmcneill
la source
2
Et downvote pour quelle raison? Ceci est une réponse valable à la question.
jeffmcneill
0

Si vous avez le mmvpackage:

mmv '*-0.png' '#1.png'

Comme (versions récentes de) rename, cela prendra un soin raisonnable pour éviter d'écraser les fichiers existants.

Toby Speight
la source