mac os x terminal renommer par lot

j'ai un dossier avec une série de fichiers nommés:

prefix_1234_567.png
prefix_abcd_efg.png

j'aimerais supprimer par lots un caractère de soulignement et le contenu du milieu pour que la sortie soit

prefix_567.png
prefix_efg.png

merci pertinent, mais pas complètement explicatif: Comment puis-je transmettre par lots des fichiers renommés en utilisant le Terminal? Regex pour renommer par lots les fichiers de mac OS X Terminal

85
demandé sur Community 2014-06-08 08:24:25

7 réponses

dans votre cas particulier, vous pouvez utiliser la commande suivante bash ( bash est le shell par défaut sur macOS):

for f in *.png; do echo mv "$f" "${f/_*_/_}"; done

Note: S'il y a une chance que vos noms de fichiers commencent par - , placez -- devant eux[1]:

mv -- "$f" "${f/_*_/_}"

Note: echo est ajouté mv afin d'effectuer un essai. L'enlever pour effectuer réel changement de nom.

vous pouvez l'exécuter depuis la ligne de commande ou l'utiliser dans un script.

  • "${f/_*_/_}" est une application de bash expansion du paramètre : le (premier) motif correspondant de la chaîne _*_ est remplacé par _ , ce qui coupe le jeton du milieu du nom.
  • noter que _*_ est un modèle (une expression de Joker, comme également utilisé pour globboire), pas une expression régulière (pour en savoir plus sur les modèles, exécuter man bash et la recherche de Pattern Matching ).

si vous vous trouvez des fichiers de renommage par lots fréquemment, envisager l'installation d'un outil spécialisé tel que le Perl-basé rename utilitaire . Sur macOS vous pouvez l'installer en utilisant populaire gestionnaire de paquet Homebrew comme suit:

brew install rename

voici l'équivalent de la commande en haut en utilisant rename :

rename -n -e 's/_.*_/_/'  *.png

encore une fois, cette commande effectue un dry run; supprimer -n pour effectuer le renommage réel.

  • similaire à la solution bash , s/.../.../ effectue la substitution de texte, mais-contrairement à dans bash - vrai les expressions régulières sont utilisées.

[1] le but de l'argument spécial -- , qui est soutenu par la plupart des utilités, est de signaler que les arguments suivants devraient être traités comme opérandes (valeurs), même si elles look comme options en raison de commencer par - , comme Jacob C. notes.

182
répondu mklement0 2018-07-31 19:16:58

pour renommer les fichiers, vous pouvez utiliser l'utilitaire rename :

brew install rename

par exemple, pour modifier une chaîne de recherche dans tous les noms de fichiers du répertoire courant:

rename -nvs searchword replaceword *

supprimer le paramètre' n ' Pour appliquer les modifications.

plus d'informations: man rename

81
répondu David Thomas 2015-07-31 02:39:09

vous pouvez utiliser sed:

ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv

résultat:

prefix_567.png prefix_efg.png

* pour effectuer un premier essai à sec, remplacer mv à la fin par echo

10
répondu l'L'l 2014-06-08 05:04:10

j'avais un lot de fichiers qui ressemblaient à ceci: be90-01.png et nécessaire de changer le tiret pour souligner. J'ai utilisé ceci, qui a bien fonctionné:

for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done
6
répondu JanB 2015-03-12 10:10:56

vous pouvez installer la commande rename en utilisant brew . il suffit de faire brew install rename et de l'utiliser.

2
répondu Nisim Joseph 2017-06-20 07:21:27

utilisant mmv

mmv '*_*_*' '#1_#3' *.png
1
répondu sddgob 2017-08-11 02:18:14

essayez cette

for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done

Voici une autre façon:

for file in Name*.png; do mv "$file" "01_$file"; done
1
répondu Joolah 2018-02-08 07:23:09