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
Sam007
la source

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
jw013
la source
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.

Chad Clark
la source
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
doneal24
la source
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

Vinnie James
la source
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
Shankey Ravi
la source
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
ccpizza
la source