Programiranje

split ukaz za DOS / Windows prek Groovy

Eden od ukazov, ki ga Linux najbolj pogrešam pri delu v okoljih Windows / DOS, je ukaz split. Ta izjemno priročen ukaz omogoča razdelitev velike datoteke na več manjših datotek, določenih s številom vrstic ali številom bajtov (ali kilobajtov ali megabajtov), ​​ki jih želite za manjše datoteke. Obstaja veliko načinov uporabe takšnih funkcij, vključno z nameščanjem datotek na določene nosilce podatkov, omogočanjem datotek, da jih »preberejo« aplikacije z omejitvami dolžine datotek itd. Na žalost ne poznam deljenega ekvivalenta za Windows ali DOS. PowerShell lahko naredimo tako, da naredi kaj takega, vendar je ta izvedba značilna za PowerShell. Na voljo so tudi izdelki drugih proizvajalcev, ki imajo podobno funkcionalnost. Vendar te obstoječe rešitve puščajo ravno toliko, da sem zaželena, da imam motivacijo za izvedbo deljenega ekvivalenta v Groovyju in to je tema tega prispevka. Ker Groovy deluje na JVM, bi to izvedbo lahko teoretično izvajali v katerem koli operacijskem sistemu s sodobno implementacijo Java Virtual Machine.

Za preizkus in prikaz razdeljenega skripta na osnovi Groovyja je potrebna neka vrsta izvorne datoteke. Za enostavno ustvarjanje te izvorne datoteke bom uporabil Groovy. Naslednji preprost skript Groovy, buildFileToSplit.groovy, ustvari preprosto besedilno datoteko, ki jo je mogoče razdeliti.

#! / usr / bin / env groovy // // buildFileToSplit.groovy // // Sprejema en argument za število vrstic, ki jih je treba zapisati v ustvarjeno datoteko. // Če ni določeno nobeno število vrstic, uporablja privzeto 100.000 vrstic. // if (! args) {println "\ n \ nUporaba: buildFileToSplit.groovy fileName lineCount \ n" println ", kjer je fileName ime datoteke, ki jo je treba ustvariti, lineCount pa je" println "število vrstic, ki jih je treba umestiti v ustvarjeno mapa." System.exit (-1)} fileName = args [0] numberOfLines = args.length> 1? args [1] kot Integer: 100000 datoteka = nova datoteka (ime_datoteke) // izbriše izhodno datoteko, če je že obstajala file.delete () 1.upto (numberOfLines, {datoteka << "To je vrstica # $ {it}. \ n "}) 

Ta preprost skript uporablja implicitno razpoložljiv ročaj Grogs za dostop do argumentov ukazne vrstice za skript buildFileToSplit.groovy. Nato na podlagi podanega argumenta o številu vrstic ustvari eno datoteko velikosti. Vsaka vrstica je večinoma originalna in v njej piše "To je vrstica #", ki ji sledi številka vrstice. To ni modna izvorna datoteka, vendar deluje za primer delitve. Naslednji posnetek zaslona prikazuje zagon in izhod.

Ustvarjena datoteka source.txt je videti tako (tukaj je prikazan samo njen začetek in konec):

To je vrstica # 1. To je vrstica # 2. To je vrstica # 3. To je vrstica # 4. To je vrstica # 5. To je vrstica # 6. To je vrstica # 7. To je vrstica # 8. To je vrstica # 9. To je vrstica # 10. . . . To je vrstica # 239. To je vrstica # 240. To je vrstica # 241. To je vrstica # 242. To je vrstica # 243. To je vrstica # 244. To je vrstica # 245. To je vrstica # 246. To je vrstica # 247. To je vrstica # 248. To je vrstica # 249. To je vrstica # 250. 

Zdaj je na voljo izvorna datoteka, ki jo je mogoče razdeliti. Ta skript je bistveno daljši, ker sem preveril, ali je v njem več pogojev napak, ker mora obdelati več parametrov ukazne vrstice in preprosto zato, ker naredi več kot skript, ki je ustvaril izvorno datoteko. Skript, ki se preprosto imenuje split.groovy, je prikazan naslednji:

#! / usr / bin / env groovy // // split.groovy // // Razdeli eno datoteko na več datotek, podobno kot deluje ukaz Unix / Linux split //. Ta različica skripta je namenjena samo besedilnim datotekam. // // Ta skript se na določen način res razlikuje od različice Linux / Unix. Na primer // izhodna sporočila tega skripta se v več primerih razlikujejo in ta // skript zahteva, da je ime datoteke, ki jo delimo, navedeno kot argument // ukazne vrstice, namesto da bi zagotovil možnost, da ga // zagotovimo kot standardni vnos . Ta skript ponuja tudi možnost "-v" ("--version"), ki ni // oglaševana za različico Linux / Unix. // // POZOR: Ta skript je namenjen le ponazoritvi uporabe Groovyja za // posnemanje ukaza skripta Unix / Linux. Ni namenjen za proizvodnjo // uporaba takšna kot je. Ta skript je zasnovan za izdelavo varnostnih kopij datotek, ustvarjenih // iz delitve ene same izvorne datoteke, vendar je // ustvarjena samo ena varnostna različica, ki jo preglasijo nadaljnje zahteve. // // // marxsoftware.blogspot.com/ // uvoz java.text.NumberFormat NEW_LINE = System.getProperty ("line.separator") // // Uporabi Groovyjev CliBuilder za obdelavo argumentov ukazne vrstice // def cli = nov CliBuilder (uporaba: 'split [OPTION] [INPUT [PREFIX]]') cli.with {h (longOpt: 'help', 'Usage Information') a (longOpt: 'length-extension', type: Number, ' Uporabite pripone dolžine N (privzeto je 2) ', args: 1) b (longOpt:' bytes ', type: Number,' Velikost vsake izhodne datoteke v bajtih ', args: 1) l (longOpt:' lines ', vrsta: Število, 'Število vrstic na izhodno datoteko', argumenti: 1) t (longOpt: 'verbose', 'Natisni diagnostiko v standardno napako tik pred odprtjem vsake izhodne datoteke', args: 0) v (različica longOpt: ' ',' Izhodna različica in izhod ', args: 0)} def opt = cli.parse (args) if (! Opt || opt.h) {cli.usage (); return} if (opt.v) {println "Različica 0.1 (julij 2010)"; return} if (! opt.b &&! opt.l) {println "Navedite dolžino razdeljenih datotek s številom bajtov ali številom vrstic" cli.usage () return} if (opt.a &&! opt.a. isNumber ()) {println "Dolžina pripone mora biti številka"; cli.usage (); return} if (opt.b &&! opt.b.isNumber ()) {println "Velikost datotek v bajtih mora biti številka"; cli.usage (); return} if (opt.l &&! opt.l.isNumber ()) {println "Številka vrstic mora biti številka"; cli.usage (); return} // // Določi, ali bodo datoteke v razdeljenem formatu določene s številom vrstic ali številom bajtov // private enum LINES_OR_BYTES_ENUM {BYTES, LINES} bytesOrLines = LINES_OR_BYTES_ENUM.LINES def suffixLength = opt.a? opt.a.toBigInteger (): 2 if (suffixLength 1? opt.arguments () [1]: "x" poskusite {file = novo datoteko (ime datoteke) if (! file.exists ()) {println "Izvorna datoteka $ {ime datoteke} ni veljavna izvorna datoteka. "System.exit (-4)} int fileCounter = 1 firstFileName =" $ {prefix} $ {fileSuffixFormat.format (0)} "if (verboseMode) {System.err.println "Ustvarjanje datoteke $ {firstFileName} ..."} outFile = createFile (firstFileName) if (bytesOrLines == LINES_OR_BYTES_ENUM.BYTES) {int byteCounter = 0 file.eachByte {if (byteCounter <numberBytes) {outFile << nov niz (it )} else {nextOutputFileName = "$ {prefix} $ {fileSuffixFormat.format (fileCounter)}" if (verboseMode) {System.err.println "Ustvarjanje datoteke $ {nextOutputFileName} ..."} outFile = createFile (nextOutputFileName) outFile << nov String (it) fileCounter ++ byteCounter = 0} byteCounter ++}} else {int lineCounter = 0 file.eachLine {if (lineCounter <numberLines) {outFile << it << NEW_LINE} else {nextOutputFileName = "$ {prefix} $ {fileSuffixFormat.format (fileCounter)} " if (verboseMode) {System.err.println "Ustvarjanje datoteke $ {nextOutputFileName} ..."} outFile = createFile (nextOutputFileName) outFile << it << NEW_LINE fileCounter ++ lineCounter = 0} lineCounter ++}}} catch (FileNotFoundException fnfException fnfException fnf println System.properties println "$ {fileName} ni veljavna izvorna datoteka: $ {fnfEx.toString ()}" System.exit (-3)} catch (NullPointerException npe) {println "NullPointerException: $ {npe.toString ()} "System.exit (-4)} / ** * Ustvarite datoteko z navedenim imenom datoteke. * * @param fileName Ime datoteke, ki jo želite ustvariti. * @return Datoteka, ustvarjena z navedenim imenom; null, če je navedeno ime nično ali * prazno. * / def Datoteka createFile (String fileName) {if (! fileName) {println "Datoteke ni mogoče ustvariti iz ničnega ali praznega imena datoteke." return null} outFile = nova datoteka (fileName), če (outFile.exists ()) {outFile.renameTo (nova datoteka (fileName + ".bak")) outFile = nova datoteka (fileName)} return outFile} 

Ta skript bi lahko optimizirali in bolje modulirali, vendar izpolnjuje svoj namen, da dokaže, kako Groovy ponuja lep pristop za izvajanje skriptov pomožnih programov, neodvisnih od platforme.

Naslednji posnetek zaslona prikazuje, kako skript uporablja Groovyjevo vgrajeno podporo CLI.

Naslednja dva posnetka zaslona prikazujeta razdelitev izvorne datoteke na manjše datoteke s številkami vrstic oziroma z bajti (in z uporabo različnih možnosti pripone in imena datoteke). Prva slika prikazuje, da se tri izhodne datoteke ustvarijo, če so razdeljene na 100 vrstic (250 vrstic v izvorni datoteki). Možnost -a določa, da bodo v imenu datoteke štiri cela mesta. V nasprotju z razdelitvijo Linuxa ta skript ne zagotavlja, da je uporabnikovo število celih števil zadostno, da pokrije število potrebnih izhodnih datotek.

Druga slika (naslednja slika) prikazuje skript, ki deli izvorno datoteko na podlagi števila bajtov in uporablja drugačno ime datoteke ter samo dve celi števili za oštevilčenje.

Kot smo že omenili, je ta skript "grob rez". Izboljšali bi ga lahko tako glede same kode kot tudi glede funkcionalnosti (razširjeno, da bi bolje podpiral binarne formate in zagotovil, da so pripone imen datotek dovolj dolge za število izhodnih datotek). Vendar tukaj skript prikazuje eno mojih najljubših uporab Groovyja: pisanje neodvisnih od platforme skriptov z uporabo znanih knjižnic Java in Groovy (SDK in GDK).

To zgodbo, "split Command for DOS / Windows Via Groovy", je prvotno objavil JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found