Kuinka tehdä useampi kuin yksi substraatti kerralla bashissa?

Minulla on hakemisto, joka sisältää kuvatiedostoja, jotka on toistettava bashissa. Toiston aikana haluan korvata sekä tiedostonimen että laajennuksen yhden rivin komennossa.

Esimerkkitiedostot:

images/file_name_1.jpg images/file_name_2.jpg 

Normaalisti voin tehdä yhden korvauksen näin:

 for i in images/*; do echo ${i/file/image}; done  

Ja tulosteen muoto on seuraava:

 images/image_name_1.jpg images/image_name_2.jpg  

Kuinka voin pitää sen silmukassa ja korvata ”jpg” -merkkijonon myös ”png”: ksi? Se on vain instanssi, voisin korvata pisteen pilkulla jne.

Kun yritän tätä:

 for i in images/*; do echo ${{i/jpg/png}/file/image}; done  

Se ei toimi. En löydä mitään muuta ratkaisua tai ideaa. Onko tämä mahdollista -Jos niin, miten?

Kommentit

  • En ' en tiedä, miksi tämä ei toiminut ' t bashissa, mutta sisäkkäiset korvaavat tuotteet toimivat aivan kuten odotit zsh: ssä. parempi kuori;)

vastaus

Yksinkertainen tapa olisi määrittää tulos muuttujalle ja työskennellä Esimerkki:

 for filename in images/* do echo "filename is now $filename" filename=${filename/jpg/png}; echo "filename is now $filename" filename=${filename/file/image}; echo "filename is now $filename" echo "final filename is ${filename}" done  

Kommentit

  • Tämä vastaus ei ole täydellinen. Korvauksia sovelletaan mihin tahansa tiedostonimen merkkijonoon. Kysymyksen perusteella Kubilay haluaa korvata etuliitteen ja laajennuksen (jälkiliitteen). voitko muokata ja ottaa tämän huomioon : $ {var / # Pattern / Replacement} Jos var: n etuliite vastaa Pattern-mallia, korvaa kuvio Korvaava. $ {var /% Pattern / Replacement} Jos varin pääte vastaa mallia ja korvaa sitten mallin korvaamalla.
  • @rMistero Ei ' ei ole sääntöä vastauksen lähettämisestä vasta siksi, että vastaus on hyväksytty. Itse asiassa mielestäni sinun pitäisi, varsinkin kun ehdottamasi semantiikka on erilainen. Tästä huolimatta tämä on tapa tehdä se, mitä toimenpideohjelman mukaan hän on kokeillut, joten vaikka on muitakin tuloksia, jotka voivat myös olla päteviä, uskon, että on turvallista olettaa, että tämä on sopusoinnussa sen kanssa, mitä toimenpideohjelma halusi saavuttaa. / li>

vastaus

Voit määrittää edellisen korvaavan muuttujan ja suorittaa korvaavan muuttujan sen sijaan.

 for i in images/* do j=${i/jpg/png} echo ${j/file/image} done  

kommentit

  • En ole varma jos se toimii. " i kuvissa / *; tee j = {i / jpg / png} kaiku $ {j / tiedosto / kuva}; valmis " kaikuu " {i / jpg / png} " toistuvasti.
  • Nyt kyllä: " kuville i kuvissa / *. jpg; tee j = $ {i / jpg / png}; kaiku $ {j / tiedosto / kuva}; valmis ". Kiitos!

Vastaa

muuttaa mikä tahansa merkkijono :

$ echo "images/file_name_1.jpg" | perl -pE "s/file/image/;s/jpg$/png/;" images/image_name_1.png 

pikakuvake uudelleennimeämiselle (mikä voi olla perimmäinen tavoite:

$ rename "s/file/image/;s/jpg$/png/;" "$i" 

kommentit

  • Luulen edelleen, että Perlin kutsuminen kerran kullekin tiedostolle on ylenmääräistä, mutta ainakin nyt tämä antaa vastauksen kysymykseen. 🙂
  • @MichaelKj ö rling Sinun ' sinun ei tarvitse kutsua Perl-tiedostoa jokaiselle tiedostolle, voit tehdä sen rename … images/*. Mutta tämä vaatii Debian-pohjaisen jakelun (rename muilla Linux-muunnelmilla on täysin erilainen komento).
  • @Gilles Ajattelin enemmän ensimmäisestä versiosta, varsinkin kun ' ei ole mitään kysymyksessä, kuten on kysytty tiedostojen uudelleennimeämisestä. Tämän vastauksen alkuperäisessä (muokattu) versiossa oli vain komentoehdotus rename.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *