aggiunta di testo al nome del file prima dell'estensione


25

Vorrei aggiungere del testo alla fine del nome file ma prima dell'estensione. In questo momento ci sto provando

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

l'output è,

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

Voglio che sia

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

Risposte:


27

Utilizzando l'espansione dei parametri POSIX standard :

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

Fantastico, è esattamente quello di cui avevo bisogno.
Sam007,

1
Potrebbe essere meglio con una spiegazione di come funziona. La risposta di Doug è piuttosto semplice, d'altra parte.
Sarge Borsch,

@SargeBorsch Cosa ti serve spiegare? La mia risposta, lo snippet nella domanda e la risposta di Doug differiscono solo per alcuni caratteri, e la risposta di Doug spiega anche meno della mia, quindi non so cosa tu voglia. Se si confronta semplicemente la differenza tra i due output nella domanda, dovrebbe essere banalmente facile capire cosa fanno. Posso spiegare perché la mia risposta è preferibile a quella di Doug. 1. Uso printfuna stringa di formato anziché la meno portatile echo. 2. Uso l'espansione dei parametri che è più efficiente della chiamata a un binario esterno ( basename) per un compito così semplice.
jw013,

Quindi il comando per rinominare i file sarebbe questo:for f in *.shp; do mv $f ${f%.shp}_poly.shp; done
Patch92

6

A volte è installato uno strumento chiamato "rinomina".

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

Potrebbe non essere portatile ma è facile da usare.


1
Questa è l'unica che ha funzionato per me, ottima risposta!
Wanderer0810,

4

Usa questo:

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

3
L'uso basenameè più lento e meno efficiente rispetto al lasciare che la shell faccia il lavoro da sola. Ciò può essere evidente per un numero molto elevato di file.
jw013,

Inoltre, ci sono virgolette mancanti --e non riesce per i nomi di file che hanno caratteri di nuova riga prima di .shp.
Stéphane Chazelas,

Grazie per aver dato una risposta con cui posso effettivamente lavorare per il mio scopo. Questo è un aiuto bash, non un codice golf. (leggendo questo .. mi rendo conto che potrebbe sembrare che fossi sarcastico. Più avvincente riguardo alle altre risposte qui che alle tue. Grazie ancora)
Tim

3

Questo ha funzionato meglio per me:

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


Bene, assomiglia molto alla risposta accettata, tranne per il fatto che probabilmente vuoi for f in *.webm, hai dimenticato di citare ${f}e ti manca un --.
Stéphane Chazelas,

1
La risposta accettata non funziona su OSX, stampa solo i nuovi nomi di file, in realtà non rinomina i file
Vinnie James,

1
Ovviamente, ti mostra come usare le espansioni della shell per ottenere il nuovo nome di file, in risposta alla domanda che sta anche generando un nome di file (con echo), ma non quello richiesto.
Stéphane Chazelas,

1

Se si trovano in posizioni diverse, eseguire: -

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

1

Poiché la domanda è: bashnon è necessario utilizzare utility esterne, poiché è possibile utilizzare bash regexps :

for i in *.shp
do
    mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.