web-dev-qa-db-fra.com

changement de nom de lot de terminal mac os x

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

100
kidnim

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 bashextension 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. .
  • Notez que _*_ 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.

  • Semblable à la solution 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.

205
mklement0

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

88
David Thomas

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:

  • e: facultatif pour une seule commande sed.
  • p: pour imprimer l'entrée sur sed, dans ce cas, ce sera le nom du fichier d'origine avant tout changement de nom
  • @: est un remplacement de/character pour rendre sed plus lisible. C'est-à-dire qu'au lieu d'utiliser sed s/search/replace/g, utilisez s @ search @ replace @ g
  • _. *: le trait de soulignement est un caractère d'échappement désignant le '.' caractère zéro ou plus de fois (par opposition à TOUS les caractères de regex)
  • -n2: indique que 2 sorties doivent être transmises à mv en tant que paramètres. pour chaque entrée de ls, cette commande sed générera 2 sorties, qui seront ensuite fournies à mv.
12
l'L'l

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
7
JanB

vous pouvez installer la commande rename en utilisant brew. faites juste brew install rename et utilisez-le.

2
Nisim Joseph

Utiliser mmv

mmv '*_*_*' '#1_#3' *.png
1
αғsнιη

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
1
Joolah