j'ai un dossier avec une série de fichiers nommés:
prefix_1234_567.png
prefix_abcd_efg.png
je voudrais retirer par lots un trait de soulignement et le contenu du milieu afin que la sortie serait
prefix_567.png
prefix_efg.png
merci pertinent mais pas complètement explicatif: comment puis-je renommer des fichiers par lots en utilisant le terminal?Regex pour renommer des fichiers par lots dans un terminal OS X
Dans votre cas spécifique, vous pouvez utiliser la commande bash
suivante (bash
est le shell par défaut sous macOS):
for f in *.png; do echo mv "$f" "${f/_*_/_}"; done
Remarque: S'il est possible que vos noms de fichiers commencent par -
, placez --
devant eux [1]:mv -- "$f" "${f/_*_/_}"
Remarque: echo
est préfixé à mv
afin d'effectuer un essai à blanc. Supprimez-le pour renommer réellement.
Vous pouvez l'exécuter à partir de la ligne de commande ou l'utiliser dans un script.
"${f/_*_/_}"
est une application de bash
extension de paramètre : le (premier) motif de correspondance de sous-chaîne _*_
est remplacé par le littéral _
, coupant ainsi le jeton central du nom. ._*_
est un motif (une expression générique, utilisée également pour la substitution), pas une expression régulière (pour en savoir plus sur modèles, exécutez man bash
et recherchez Pattern Matching
).Si vous vous trouvez fréquemment en train de renommer des fichiers par lots, envisagez d'installer un outil spécialisé tel que l'utilitaire Perl rename
. Sur macOS, vous pouvez l’installer à l’aide du gestionnaire de paquets très répandu Homebrew comme suit:
brew install rename
Voici l'équivalent de la commande en haut à l'aide de rename
:
rename -n -e 's/_.*_/_/' *.png
Encore une fois, cette commande effectue un essai à blanc; retirez -n
pour effectuer le changement de nom réel.
bash
, s/.../.../
effectue une substitution de texte mais, contrairement à bash
, les expressions vraies sont utilisées.[1] L'objet de l'argument spécial --
, 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 ressemble aux options en commençant par -
, comme Jacob C. notes.
Pour renommer des 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 actuel:
rename -nvs searchword replaceword *
Supprimez le paramètre 'n' pour appliquer les modifications.
Plus d'infos: man rename
Vous pouvez utiliser sed:
ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv
résultat:
prefix_567.png prefix_efg.png
* pour faire un essai à sec en premier, remplacez mv
à la fin par echo
Explication:
J'avais un lot de fichiers qui ressemblait à ceci: be90-01.png et je devais changer le tiret en soulignement. J'ai utilisé cela, qui a bien fonctionné:
for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done
vous pouvez installer la commande rename
en utilisant brew
. faites juste brew install rename
et utilisez-le.
Utiliser mmv
mmv '*_*_*' '#1_#3' *.png
essaye ça
for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done
Voici un autre moyen:
for file in Name*.png; do mv "$file" "01_$file"; done