Hogyan lehet egyszerre több alsort cserélni a bash-ban?

Van egy könyvtáram, amely képfájlokat tartalmaz, amelyeket a bash-ban kell visszhangozni. Visszhangzás közben mind a fájl nevét, mind a kiterjesztését egy soros parancsban szeretném lecserélni.

Példa fájlokra:

images/file_name_1.jpg images/file_name_2.jpg 

Rendszerint egyetlen cserét is megtehetek:

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

A kimenet pedig a következő lesz:

 images/image_name_1.jpg images/image_name_2.jpg  

Hogyan tarthatom be a ciklushoz, és a “jpg” karakterláncot is “png” -re cserélhetem? Ez csak egy példány, kicserélhetem a pontot vesszőre stb.

Amikor megpróbálom:

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

Nem működik. Nem találok más megoldást vagy ötletet. Lehetséges-e, ha igen, hogyan?

Megjegyzések

  • Nem ' nem tudom, miért nem működött ' t a bash-ban, de a beágyazott helyettesítők ugyanúgy működnek, mint amire számítottál a zsh-ben. Környezettől függően fontolóra veheti a jobb shell;)

Válasz

Az egyszerű megközelítés az eredmény hozzárendelése egy változóhoz, majd a munka ezzel a változóval. Példa:

 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  

Megjegyzések

  • Ez a válasz nem teljes. A helyettesítések a fájlnév karaktersorozatán bárhol érvényesek lesznek. A kérdés alapján Kubilay egy előtagot és egy kiterjesztést (utótagot) akar kicserélni. módosíthatja és figyelembe veheti ezt : $ {var / # Pattern / Replacement} Ha a var előtagja megegyezik a Patternnel, akkor cserélje ki a Replace helyett a mintát. $ {var /% Pattern / Replacement} Ha a var toldalék a Pattern-hez, majd helyettesítse a Pattern-t.
  • @rMistero Nincs ' s nem tiltja, hogy újabb választ küldjön csak azért, mert a választ elfogadták. Valójában szerintem meg kellene, főleg, hogy az általad javasolt szemantikája más. Ez azt jelenti, hogy így kell tennie, amit az OP mondott, miután megpróbálta, így még ha vannak is más eredmények, amelyek szintén érvényesek lehetnek, úgy gondolom, hogy nyugodtan feltételezhetjük, hogy ez összhangban áll azzal, amit az OP el akart érni. / li>

Válasz

Az előző helyettesítőt hozzárendelheti egy változóhoz, és futtathatja helyette a változót

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

Megjegyzések

  • Nem biztos ha működik. " i képekben / *; do j = {i / jpg / png} visszhang $ {j / fájl / kép}; kész " visszhangzik " {i / jpg / png} " ismételten.
  • Most igen: " for i képeken / *. jpg; do j = $ {i / jpg / png}; echo $ {j / fájl / kép}; kész ". Köszönöm!

Válasz

bármilyen karakterlánc megváltoztatásához:

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

az átnevezéshez szükséges parancsikon (ami lehet a végső cél:

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

megjegyzések

  • Még mindig úgy gondolom, hogy a Perl minden fájlhoz való egyszeri meghívása túlzott, de legalább most ez ad választ a kérdésre. 🙂
  • @MichaelKj ö rling Nem szükséges ' minden fájlhoz meghívni a Perl-t, ezt megteheti: rename … images/*. Ehhez azonban Debian-alapú terjesztésre van szükség (a rename más Linux változatokon teljesen más parancs).
  • @Gilles Többet gondoltam az első verzióra, különösen, mivel ' nincs semmi a fájlok átnevezésével kapcsolatban feltett kérdésben. A válasz eredeti (türelmi időszakban szerkesztett) verziójában csak a rename parancsjavaslat szerepelt.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük