uzantıdan önce dosya adına metin ekleme


25

Dosya adının sonuna, ancak uzantıdan önce metin eklemek istiyorum. Şu an deniyorum

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

çıktı

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

Olmasını istiyorum

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

Yanıtlar:


27

Standart POSIX parametre genişletmesini kullanarak :

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

Müthiş bu tam ihtiyacım olan şeydi.
Sam007

1
Nasıl çalıştığını bir açıklama ile daha iyi olabilir. Öte yandan, Doug cevabı oldukça kolaydır.
Sarge Borsch

@SargeBorsch Neye ihtiyacınız var? Cevabım, sorudaki pasajı ve Doug'ın cevabı sadece birkaç karakterden oluşuyor ve Doug'ın cevabı benimkinden bile daha azını açıklıyor, bu yüzden ne istediğini bilmiyorum. Sorunun iki çıktısındaki farkı sadece karşılaştırırsanız, ne yaptıklarını anlamak çok kolay olacaktır. Cevabımın neden Doug’lara tercih edildiğini açıklayabilirim. 1. Daha printfaz taşınabilir yerine bir format dizesiyle kullanıyorum echo. 2. basenameBöyle basit bir görev için harici bir ikili ( ) çağırmaktan daha verimli olan parametre genişletmesini kullanıyorum .
jw013

Sonra dosyaları yeniden adlandırmak için komut bu olacaktır:for f in *.shp; do mv $f ${f%.shp}_poly.shp; done
Patch92

6

Bazen yüklü "yeniden adlandır" adlı bir araç var.

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

Taşınabilir olmayabilir, ancak kullanımı kolaydır.


1
Bu benim için çalışan tek kişi, büyük cevap!
wanderer0810

4

Bunu kullan:

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

3
Kullanımı basename, kabuğun işi kendi başına yapmasına izin vermekten daha yavaş ve daha az verimlidir. Çok sayıda dosya için bu fark edilebilir.
jw013

Ayrıca, eksik tırnak işaretleri ve --s vardır ve bunlar, daha önce yeni satır karakterleri içeren dosya adları için başarısız olur .shp.
Stéphane Chazelas

Cevap verdiğiniz için teşekkür ederim, aslında amacım için çalışabilirim. Bu bash yardımcısıdır, golf kodunu değil. (bunu okuyordum .. Sanırım alaycı gibi geliyor gibi geldiğimi farkettim. Buradaki diğer cevapları sizinkinden daha fazla kavradım. Tekrar teşekkürler)
Tim

3

Bu benim için daha iyi çalıştı:

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


Peki, bu muhtemelen kabul etmen dışında, kabullenilen cevaba çok benziyor, for f in *.webmalıntı yapmayı unuttun ${f}ve a --.
Stéphane Chazelas,

1
Kabul edilen cevap OSX'te çalışmıyor, yalnızca yeni dosya adlarını yazdırıyor, aslında dosyaları yeniden adlandırmıyor
Vinnie James

1
Elbette, size bir dosya adını (birlikte echo) veren ancak gerekli olanı yanıtlamayan soruna cevaben yeni dosya adını almak için kabuk genişlemelerinin nasıl kullanılacağını gösterir .
Stéphane Chazelas

1

Eğer farklı konumlardalarsa, koşun: -

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

1

Asıl soru, bashharici yardımcı programlara gerek olmadığından bash regexps'i kullanabildiğiniz için :

for i in *.shp
do
    mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.