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 (arename
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.