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
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 debash
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écuterman bash
et la recherche dePattern 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 à dansbash
- 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.
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
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
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
vous pouvez installer la commande rename
en utilisant brew
. il suffit de faire brew install rename
et de l'utiliser.
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