|
Oleks vaja luua programm, mis suudaks muuta faililaiendit näiteks minujutt.TXT -> minujutt.txt . Kui fail on juba olemas võiks mingi veateate anda ja CTRL + C võiks töö lõpetada. Ise aga olen skriptimise maailmas uus ja kokku tegin mingi taolise esialgse testi.
Vaja oleks muuta see selliseks, et kontrolliks kõiki parameetreid ning lõpp tulemus oleks näiteks kujul
|
|
Ei ole vaja luua, rename tuleb Perliga juba kenasti kaasa. Kõnealune ümbernimetamine käib niimoodi:
Pane ka tähele, et praegu konvertis üks inimene Sinu "minujutt.TXT" jutu spetsifikatsiooniks "suurte tähtedega kirjutatud laiend .TXT tuleb asendada väikeste tähtedega kirjutatud sama laiendiga". Masin ei oska sellist tõlkimist korralikult teha; selle peale, et Sa filecase1 sisse "minujutt.TXT" ja filecase2 sisse "minujutt.txt" panna võid ja masin siis "sinujutt.TXT"'d Sinu tahtmist mööda nimetada oskab, loota ei ole eriti kaval. Erratum: rea keskel oli millegipärast üks ülearune kaldkriips. Parandatud. |
|
Lihtsam oleks vist ära kasutada Operatsioonisüsteemide enda nõkse: Näiteks Linuxi ja Windowsi all toimib selline käsk täitsa edukalt, või on soov kindlasti teha bash script? Windowsis:
Linuxis:
Milleks leiutada jalgratast uuesti? Ühe kaupa failide nimede muutmiseks:
No ja kui väga igav on siis tee see skript siis. Kuid ma ei saa aru milleks? Javas üks näide:
|
|
Hetkel on see rename hea mõte, aga faililaiendeid on palju ja võiks kuidagi vabamalt muuta teiseks faililaiendiks. Vastuse kohta käiv kommentaar on parem panna kommentaarina selle vastuse külge. SO mootor võimaldab vaatajal vastuseid mitmes erinevas järjekorras vaadata ja mõnel juhul võib kommentaar kommenteeritavast päris kaugele sattuda.
(Jan 04 '10 at 08:46)
Ahto Truu ♦♦
No kui laiendeid on palju, siis on kasulik ära õppida, kuidas rename'ile esimest argumenti kirjutatakse. Terve Perl on käsutada, võimalusi on kui mitte just piiramatult siis vähemalt lugematult. Vihjena mainin 's/.w+$/lc $&/e' kui ühe põneva võimaluse ära.
(Jan 04 '10 at 12:56)
dig
Äkki kellegil on oma lahendus või mingine mõte olemas ja saaks näidata korralikul kujul. Sisendiks näiteks failinimi ja võiks saada muuta siis ükskõik mis kujule. Oletame sisendfailil on arvuta.txt, siis sh failinimi.sh arvuta MP3. .txt muudetakse .MP3-ks, või sh failinimi.sh arvuta TXT . arvuta.txt -> arvuta.TXT. Tänud.
(Jan 06 '10 at 13:31)
Ragnar 1
|
Äkki keegi aitaks sellisel lahendusel selle rekursiivsuse ära kaotada ja viia kujule:
Tänud. Aga mingisugust rekursiivsust ju ei ole?
(Jan 09 '10 at 23:00)
dig
|
|
Ma tean neid võimalusi, aga mulle oleks palju mugavam too lahendus, mida üleval pakkusin, aga kujul, et ma saaksin ühehaaval faile muuta, sest hetkel ta muudab kõik .png failid millekski teiseks faililaiendiks. Ja lisaks see töötab edukalt tar.gz-ga. Aga võikski kaotada see nn "rekursiivsus" ja viia kujule failinimi.laiend -> failinimi.laiend2 Kuigi jah, lihtsamalt saaks asi ära lahendada. Lihtsus pole antud juhul tähtis. Mul on vaja skriptikujul ikkagi korralikult ülesehitatud skripti, koos kontrollidega. Tänud. tegelikult jääb ikkagi väga segaseks mida sa saavutada tahad. näitekskonkreetsemalt: 1) mida sa mõtled failide ühehaaval muutmise all 2) mida sa tahtsid öelda lausega "see töötab tar.gz-iga" 3) mis värk selle rekursiivse ja selle kaotamisega on? ps: shelliskiptis kontrollide kohta loe "man test"
(Jan 10 '10 at 19:58)
sigamozart
Mul vaja too samane fail muuta kujule, et ma saaksin muuta command line alt nii: sh skriptinimi.sh fail.case1 fail.case2 Ta hetkel muudab ju kõik failid korraga ehk siis pmst rekursiivselt (kaudselt). Oletame png PNG -> kõik png failid muudetakse PNG-ks. Aga ma tahan oletame vaid faili pilt1.png muuta pilt2.PNG-ks SELLE MA TAHAN olemasolevat muuta natuke, et ta vastaks nendele tingimustele. Mu ülesanne ei ole teha asja lihtsamalt. Tänud.
(Jan 10 '10 at 20:43)
Ragnar 2
|
|
Piirangud kehtivad, sest vaja on etteantud lahendus muuta seisust A seisu B, kus A on algseis (etteantud skript) ja seis B on minu soovitud tulemus sh skript.sh failinimi.laiend1 failinimi.laiend2. Loodan, et tegin nüüd asja selgeks. Ma ei tohi kasutada ei ühtegi teist lahendust kui vaid see. Olgu neid lihtsamaid lahendusi kasvõi miljon. Konkreetselt on vaja see ülesanne toimima saada. Tänud. |
|
Minupoole lahendus: http://pastebin.org/74392 ütleb mulle, et mv : cannot move fail.png to . No such file or directory (loodud on fail.png ilusti kaustas). Miski sed probleem vist. Igastahes kuskil on mul mingi sünaksiviga. Äkki keegi vaataks üle ja üritan edasi samale kujule viia. Tänud. |
|
Ma vist hakkan aru saama, et sa tahad skripti, mis leiaks parameetriteks antud failinimede laiendid ja nimetaks nende laiendite põhjal ümber kataloogis olevad failid. Näiteks nii:
Kui nii, siis peaks hakkama saama millegi sellisega:
Rekursiooni all mõtled sa äkki seda, et käiakse läbi ka alamkataloogid. Kui nii, siis lisa |
|
Ma tänan. Lõpuks mõistlik lahendus. Ainus viga on see, et sa võiksid teha sama skripti ka selleks, et faile ükshaaval muuta. Et kui annan käsu skript.c skript.C - siis muudetakse vaid skript.c fail skript.C-ks ja teised .c failid jäetakse rahule. Rene, natuke muudaksid, oleks ideaalne. Sest ma saan kasutada nii su seda lahendust (paljude failide jaoks), kui ka teinekord oleks üksikuid faile muuta. Tänud. EDIT: isegi su kontrollid olid ideaalsed. Võid lisada viimasele skriptile, et kui fail olemas, siis öelda midagi. (Parim vastus). Sellest ükshaaval muutmise asjast ma aga küll aru ei saa. Sa tahad, et see teeks teatud juhtudel sama mis lihtsalt
(Jan 11 '10 at 20:10)
Rene Saarsoo ♦♦
|
|
Sinu lahendus on väga hea, aga see hetkel tegi nii: mul on kaustas foo.c, laulja.c, test.c ja suvaline.c, kui ma rakendan seda skripti kaustal (suvaline.c suvaline.C, siis lisaks suvaline.C muutusele muutuvad ka laulja.C, foo.C , test.C). Ma tahaks, et skripti üldkuju jääks samaks, aga ta lihtsalt suvaline.c korral teeks suvaline.C või laulja.c korral teeks laulja.C (igaüks eraldi) (kaoks see terve kausta failide rename üldse ära) ja ei saaks teha (foo.bar fooooooo.bar2 ka)., oleksid 2 samasusuguse ülesehitusega skripti, aga toimimine erinev (üks muudab nagu hetkel - sinu poolt tehtud) ja see uus kasutades mv samamoodi ja tehes neid teste. (sama skript, teise funktsionaalsusega). Palun aita see lihtsalt niimoodi ära teha ja ohtlikkus ja muu ei ole parameeter ega tähtis. Ma ise dokumenteerin. Hetkel on tähtis layout, mis sinu puhul mulle meeldis. Kõik toimis nii nagu peab. Kordan üle. Samamoodi trükin foo.c foo.C ja failist saab foo.C (foo ehk failinimi, peab alati olema staatiline), laiend aga muutuv). ei muudeta teisi .c faile ega .xxx , kus xxx on siis suvaline faililaiend ega tehta muid asju. Tänan. Sa tahad hoopis eraldi skripti, mis töötaks nagu
(Jan 11 '10 at 21:47)
Rene Saarsoo ♦♦
|

Lugesin su seletuse mitmed korrad läbi, aga kohe mitte ei saanud aru, mida need
filecase1jafilecase2parameetrid tegema peaksid. Mainin vaid seda, etbashjashon erinevad programmid - skripti algusesse on sul kirjutet#!/bin/bash(seega oleks nagu tegemist bashi skriptiga), siis aga käivitad sa sedashkäsuga. Kumba shelli sa siis nüüd ikkagi kasutada tahad?