J'ai un dossier avec une série de fichiers nommés:
prefix_1234_567.png
prefix_abcd_efg.png
Je voudrais supprimer par lots un trait de soulignement et le contenu du milieu afin que la sortie soit:
prefix_567.png
prefix_efg.png
Pertinent mais pas complètement explicatif:
_*_
par un espace.Réponses:
Dans votre cas particulier, vous pouvez utiliser la
bash
commande suivante (bash
est le shell par défaut sur macOS):Remarque: s'il est possible que vos noms de fichiers commencent par
-
, placez-les--
avant [1]:mv -- "$f" "${f/_*_/_}"
Remarque:
echo
est précédé demv
pour effectuer un essai à sec. Supprimez-le pour effectuer un changement de nom réel.Vous pouvez l'exécuter à partir de la ligne de commande ou l'utiliser dans un script.
"${f/_*_/_}"
est une application d'bash
expansion des paramètres : le (premier) modèle de correspondance de sous-chaîne_*_
est remplacé par un littéral_
, coupant efficacement le jeton du milieu du nom._*_
s'agit d'un modèle (une expression générique, comme également utilisée pour le globbing), pas une expression régulière (pour en savoir plus sur les modèles, exécuterman bash
et rechercherPattern Matching
).Si vous vous retrouvez fréquemment à renommer des fichiers par lots, envisagez d'installer un outil spécialisé tel que l'
rename
utilitaire basé sur Perl . Sur macOS, vous pouvez l'installer à l'aide du gestionnaire de packages populaire Homebrew comme suit:Voici l'équivalent de la commande en haut utilisant
rename
:Encore une fois, cette commande effectue un essai à vide; remove
-n
pour effectuer un changement de nom réel.bash
solution,s/.../.../
effectue une substitution de texte, mais - contrairement à dansbash
- des expressions régulières vraies sont utilisées.[1] Le but de l'argument spécial
--
, qui est pris en charge par la plupart des utilitaires, est de signaler que les arguments suivants doivent être traités comme des opérandes (valeurs), même s'ils ressemblent à des options en commençant par-
, comme le note Jacob C ..la source
.*
->$1
), par exemple RenommerFoo bar S01E01 biz baz.ext
enS01E01.ext
:rename -n -e 's/.*(S[0-9]{2}E[0-9]{2}).*(\.[a-z]{2,4})/$1$2/' *
echo
pour les essais à sec. Merci pour le conseil!brew install rename
Pour renommer des fichiers, vous pouvez utiliser l'
rename
utilitaire:brew install rename
Par exemple, pour modifier une chaîne de recherche dans tous les noms de fichiers du répertoire actuel:
Supprimez le paramètre «n» pour appliquer les modifications.
Plus d'informations:
man rename
la source
OS X
les versions deGNU bash
( x86_64-apple-darwin ) n'incluent pas l'utilitaire de changement de nom.brew install rename
rename -vs GLYCOPHORIN GLYCC *
et maintenant il renomme automatiquement plus de 450 fichiers. Et super rapide aussi.Vous pouvez utiliser sed:
résultat:
* pour effectuer d'abord un essai à sec, remplacer
mv
à la fin parecho
Explication:
la source
ls * | xargs -I % bash -c 'echo mv "%" "$(sed 's@_.*_@_@' <<<"%")"'
(supprimerecho
pour renommer).J'avais un lot de fichiers qui ressemblaient à ceci: be90-01.png et j'avais besoin de changer le tiret en soulignement. J'ai utilisé ceci, qui a bien fonctionné:
la source
vous pouvez installer la
rename
commande en utilisantbrew
. faites-lebrew install rename
et utilisez-le.la source
En utilisant
mmv
la source
sudo apt-get install mmv
.brew install mmv
.essaye ça
Voici une autre façon:
la source