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

Richard
la source

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
bash-o-logist
la source
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
Michał Šrajer
la source
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
Karoly Horvath
la source
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 .

sorpigal
la source
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
Fredrik Pihl
la source
4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done
ztank1013
la source
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:

James Yen
la source
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.

Easwar
la source
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
C. Ramseyer
la source
0

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

Jadeye
la source
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
Tharindu Sathischandra
la source