J’ai un dossier avec une série de fichiers nommés:
prefix_1234_567.png prefix_abcd_efg.png
Je voudrais supprimer en lot un trait de soulignement et le contenu du milieu de sorte que la sortie serait
prefix_567.png prefix_efg.png
merci pertinent mais pas complètement explicatif: comment puis-je renommer par lots les fichiers en utilisant le terminal? Regex pour renommer par lots les fichiers dans le terminal OS X
Dans votre cas spécifique, vous pouvez utiliser la commande bash
suivante ( 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 -
, place --
avant eux [1]:
mv -- "$f" "${f/_*_/_}"
Remarque: l’ echo
est ajouté à mv
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 de l’ extension du paramètre bash
: le motif de correspondance (premier) de la sous-chaîne _*_
est remplacé par un littéral _
, coupant ainsi le jeton du nom. _*_
est un modèle (une expression générique, également utilisée pour les globulations), et non une expression régulière (pour en savoir plus sur les patterns, exécutez man bash
et recherchez Pattern Matching
). Si vous rename
fréquemment des fichiers par lot, envisagez d’installer un outil spécialisé tel que l’ utilitaire de rename
basé sur Perl . Sur macOS, vous pouvez l’installer en utilisant le gestionnaire de paquets populaire Homebrew comme suit:
brew install rename
Voici l’équivalent de la commande du haut en utilisant rename
:
rename -n -e 's/_.*_/_/' *.png
Encore une fois, cette commande effectue un essai à sec; supprime -n
pour effectuer un changement de nom réel.
bash
, s/.../.../
effectue la substitution de texte, mais contrairement à bash
, les expressions régulières vraies sont utilisées. [1] Le but de l’argument spécial --
qui est supporté 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. .
Pour renommer des fichiers, vous pouvez utiliser l’utilitaire de rename
:
brew install rename
Par exemple, pour modifier une chaîne de recherche dans tous les noms de fichiers du répertoire en cours:
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
* faire une course sèche d’abord, remplacer mv
à la fin par echo
J’avais un lot de fichiers qui ressemblaient à ceci: be90-01.png et il fallait changer le tiret en trait de soulignement. J’ai utilisé ceci, ce qui a bien fonctionné:
for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done
vous pouvez installer la commande rename
en utilisant l’ brew
. Il suffit de faire le programme d’ brew install rename
et le brew install rename
.
Utiliser mmv
mmv '*_*_*' '#1_#3' *.png
essaye ça
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