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
.