ajout de texte au nom de fichier avant l'extension


25

Je voudrais ajouter du texte à la fin du nom de fichier mais avant l'extension. En ce moment j'essaye,

for f in *.shp; do echo $f_poly; done

la sortie est,

Quercus_acutifolia.shp_poly
Quercus_agrifolia.shp_poly
Quercus_corrugata.shp_poly
Quercus_cortesii.shp_poly
Quercus_costaricensis.shp_poly
Quercus_havardii.shp_poly
Quercus_hemisphaerica.shp_poly
Quercus_kelloggii.shp_poly
Quercus_knoblochii.shp_poly
Quercus_laceyi.shp_poly

Je veux que ce soit,

Quercus_acutifolia_poly.shp
Quercus_agrifolia_poly.shp
Quercus_corrugata_poly.shp
Quercus_cortesii_poly.shp
Quercus_costaricensis_poly.shp
Quercus_havardii_poly.shp
Quercus_hemisphaerica_poly.shp
Quercus_kelloggii_poly.shp
Quercus_knoblochii_poly.shp
Quercus_laceyi_poly.shp

Réponses:


27

Utilisation de l'extension de paramètres POSIX standard :

for f in *.shp; do printf '%s\n' "${f%.shp}_poly.shp"; done

Génial c'est exactement ce dont j'avais besoin.
Sam007

1
Pourrait être mieux avec une explication comment cela fonctionne. D'un autre côté, la réponse Doug est assez facile.
Sarge Borsch

@SargeBorsch De quoi avez-vous besoin expliqué? Ma réponse, l'extrait de la question et la réponse de Doug ne diffèrent que par quelques caractères, et la réponse de Doug explique encore moins que la mienne, donc je ne sais pas ce que vous voulez. Si vous comparez simplement la différence entre les deux sorties dans la question, il devrait être facile de comprendre ce qu'elles font. Je peux expliquer pourquoi ma réponse est préférable à celle de Doug. 1. J'utilise printfavec une chaîne de format au lieu du moins portable echo. 2. J'utilise l'expansion des paramètres qui est plus efficace que d'appeler un binaire externe ( basename) pour une tâche aussi simple.
jw013

Ensuite, la commande pour renommer les fichiers serait la suivante:for f in *.shp; do mv $f ${f%.shp}_poly.shp; done
Patch92

6

Parfois, un outil appelé "renommer" est installé.

rename 's/\.shp$/_poly.shp/' *shp

Il n'est peut-être pas portable, mais il est facile à utiliser.


1
C'est le seul qui a fonctionné pour moi, excellente réponse!
wanderer0810

4

Utilisez ceci:

for file in *.shp; do echo $(basename $file .shp)_poly.shp; done

3
L'utilisation basenameest plus lente et moins efficace que de laisser le shell faire le travail seul. Cela peut être visible pour un très grand nombre de fichiers.
jw013

En outre, il manque des guillemets et des --s et il échoue pour les noms de fichiers qui ont des caractères de nouvelle ligne avant le .shp.
Stéphane Chazelas

Merci d'avoir donné une réponse avec laquelle je peux réellement travailler pour mon but. C'est de l'aide bash, pas du golf de code. (En lisant ceci. Je me rends compte que cela peut sembler être sarcastique. Plus saisissant sur les autres réponses ici que sur la vôtre. Merci encore)
Tim

3

Cela a mieux fonctionné pour moi:

for f in *; do NEW=${f%.webm}_2016.webm; mv ${f} "${NEW}"; done


Eh bien, cela ressemble beaucoup à la réponse acceptée, sauf que vous le voulez probablement for f in *.webm, vous avez oublié de citer le ${f}et vous manquez un --.
Stéphane Chazelas

1
La réponse acceptée ne fonctionne pas sur OSX, elle n'imprime que les nouveaux noms de fichiers, elle ne renomme pas réellement les fichiers
Vinnie James

1
Bien sûr, il vous montre comment utiliser les extensions de shell pour obtenir le nouveau nom de fichier, en réponse à la question qui génère également un nom de fichier (avec echo), mais pas celui requis.
Stéphane Chazelas

1

S'ils se trouvent dans des emplacements différents, exécutez: -

for i in ` find /root/test/ -name "*.shp" ` ;
do
  mv $i ` echo $i | sed 's/.shp$/_poly.shp/g' ` ;
done

1

Comme la question est pour bashil n'y a pas besoin d'utilitaires externes, car vous pouvez utiliser des expressions rationnelles bash :

for i in *.shp
do
    mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
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.