Renommez tous les fichiers du répertoire de $ filename_h à $ filename_half?


139

Mort simple.

Comment renommer

05_h.png
06_h.png

à

05_half.png
06_half.png

Au moins, je pense que c'est simple, mais c'est difficile pour Google pour ce genre de chose à moins que vous ne le sachiez déjà.

Merci....

Réponses:


302

Utilisez simplement bash, pas besoin d'appeler des commandes externes.

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done

Ne pas ajouter #!/bin/sh

Pour ceux qui ont besoin de cette doublure:

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done

7
Bonne utilisation du remplacement de chaîne intégré de bash plutôt que de sed
dandrews

3
'est-ce que file / _h.png / _half.png regex?
user2799603

15
Non, le format est le suivant: $ {chaîne / sous-chaîne / substitution} - "remplacer la première occurrence". Pour plus d'informations, consultez cette feuille de triche (section "chaînes"): bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf
WindRider

11
Des raisons pour Do not add #!/bin/sh? J'ai essayé à la fois de travailler avec / sans cette déclaration.
Ryan

6
@Ryan @Ishan Jain En fait, cela indique le shell backend qui doit exécuter le script. sh et bash sont des shells différents et peuvent donc affecter le comportement et la syntaxe du script. Comme le script utilise un remplacement de chaîne intégré bash, vous devez ajouter l'en-tête #!/bin/bash. Cela dit, bash est normalement le shell par défaut sur de nombreux ordinateurs, vous ne trouverez donc pas beaucoup de différences: D Vous pouvez trouver plus d'informations ici
Cristian Ramon-Cortes

65

Essayez la renamecommande:

rename 's/_h.png/_half.png/' *.png

Mettre à jour:

exemple d'utilisation:

créer du contenu

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls 
one_h.png  three_h.png  two_h.png

solution d'essai:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png

1
@CarolineAlexiou: J'ai ajouté une session de test d'exemple. Essayez-le. Vous avez probablement une faute de frappe. Quelle est la sortie de ls? qu'est-ce que rename ...vous essayez?
Michał Šrajer

2
Ne fonctionne pas en bash sur Mac, fwiw. renamen'est pas un outil Unix standard.
tandrewnichols

1
@tandrewnichols, essayez homebrew - une fois installé, le changement de nom devient disponible en quelques secondes avecbrew install rename
Simbamangu

4
quant à moi, le renommage ne fonctionnait pas avec 's//'- j'ai fait référence à l'homme et il y avait un simple synopsis rename [options] expression replacement file...rename from util-linux 2.23.2
:,

2
gardez à l'esprit que .correspond à N'IMPORTE QUEL caractère, pas seulement un point - pour un point littéral, utilisez à la \.place
Meisner

11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done

1
C'est parfait pour faire une course à sec au préalable. J'ai d'abord remplacé mv $f $fnewpar echo $fnewcomme deuxième ligne pour m'assurer que la sortie semble saine.
lobati

10

Êtes-vous à la recherche d'une solution pure bash? Il existe de nombreuses approches, mais en voici une.

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done

Cela suppose que les seuls fichiers du répertoire en cours qui se terminent par _h.pngsont ceux que vous souhaitez renommer.

Beaucoup plus spécifiquement

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done

En supposant que ces deux exemples sont les vôtres. des dossiers.

Pour le cas général, de renommer le fichier en a été couvert avant .


6

Utilisez l' renameutilitaire écrit en perl. Peut-être que ce n'est pas disponible par défaut cependant ...

$ touch 0{5..6}_h.png

$ ls
05_h.png  06_h.png

$ rename 's/h/half/' *.png

$ ls
05_half.png  06_half.png

4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done

4

J'ai eu une question similaire: dans le manuel, il décrit renommer comme

rename [option] expression replacement file

pour que vous puissiez l'utiliser de cette manière

rename _h _half *.png

Dans le code: «_h» est l'expression que vous recherchez. «_half» est le modèle par lequel vous souhaitez remplacer. '* .png' est la plage de fichiers que vous recherchez pour vos éventuels fichiers cibles.

J'espère que cela peut aider c:


1

Une autre approche peut être manuellement en utilisant l'option de changement de nom par lots

Faites un clic droit sur le fichier -> Commandes personnalisées de fichier -> Renommer par lots et vous pouvez remplacer h. avec la moitié.

Cela fonctionnera pour l'interface graphique basée sur Linux utilisant WinSCP, etc.


0

Utilisez l' renameutilitaire:

rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' * 
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png

0

Bon mot:
for file in *.php ; do mv "$file" "_$file" ; done


0

Bien que l' ensemble de réponses soit complet, je dois en ajouter un autre manquant.

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.