Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Script de bash pentru convertire a testelor pentru probleme  (Citit de 3664 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
upthewall
Vizitator
« : Martie 16, 2006, 14:04:08 »

Hey, uite nu am avut si eu ce face o juma de ora si m-am gandit ca asa ceva ar fi folositor.
Scriptul asta pentru bash (adica merge doar pe linux) converteste testele din orice format (exemplu nume_problema.in15   si .ou15 ) in ceva de genul 0-Nume_Problema.in/.ok

Cod:

#!/bin/bash
#RENAME TESTS, VERSION 1.3
#SCREW COPYRIGHT :P

base=`basename "$0"`

i_format=$1
files="*.*"
if [ "$2" != "" ];then
  files="$2"
fi
if [ "$#" -lt 1 ]
then
  echo "Usage: $base <Initial Test Format> [Directory]"
  echo "Format:      %N - file name  ( A-Z, a-z )"
  echo "             %n - numerical file name  ( A-Z, a-z, <<0-9>> )"
  echo "             %E - extension  ( a-z, A-Z ) -> won't be parsed"
  echo "             %T - test number ( 0-9 )"
  echo "             -  - junk character ( anything but dot ); -* => more junk"
  echo "Example:     $base %N.%E%T ... will transform to %T-%N.new extension"
  echo 'Dir. can be :dir1/dir2 ( can use trailing / ) ( DO NOT USE WILDCARDS )'
  echo 'Extension is extracted from file name, and is: '
  echo '.in        for    .in found'
  echo '.ok        for    .ou, .ok found'
  echo 'Otherwise, file is not processed'
  exit
fi

# format parsing... %N, %n, %T, -, ., and %E ....................
replace_str='\2-\1'
# name after test number? we'll see now ( %N/%n after %T )
n_after=`echo "$i_format" | sed 's/.*\(%T\).*\(%[Nn]\).*/\1\2/'`
if [ "`echo $n_after|tr [a-z] [A-Z]`" == "%T%N" ]; then
  replace_str='\1-\2'
fi
 
sedcmd=`echo "$i_format" | sed 's/\\./\\\./' | sed 's/-/[^\\\.]/' | sed 's/%N/\\\([a-z]*\\\)/' | sed 's/%n/\\\([a-z0-9]*\\\)/' | sed 's/%E/[a-z]*/' | sed 's/%T/\\\([0-9]*\\\)/'`
# finished parsing ..............................................

for file in `ls -1 $files`
do
  if [ -f "$files/$file" ]; then
    #mv "$file" "$file2.$cumscheama$punctc"
    file_name=`basename $file`
    file_lower=`echo $file_name | tr [A-Z] [a-z]` # just the name, not the path
    exten=`echo $file_lower | sed 's/.*\.\([^\.]*\)$/\1/'`
    extension=""
    tt=`echo $exten | grep 'in'`
    if [ "$?" == "0" ]; then
      extension="in"
    else
      tt=`echo $exten | grep 'o[uk]'`
      if [ "$?" == "0" ]; then
        extension="ok"
      fi
    fi
    if [ "$extension" != "" ]; then
      command="s/$sedcmd/$replace_str\\.$extension/"
      new_file=`echo "$file_lower" | sed $command`
      if [ "$file" != "$new_file" ]; then
        echo "$file_name > $new_file"
        #file_path=`expr "$file" : '\(.*\/\)[^\/]*'`
        mv "$files/$file" "$files/$new_file"
      fi
    fi
  fi  
done

# END OF SCRIPT


btw, am pus versiunea 1.4 care stie si sa ii puna un nume ales de tine (prin -nume ... ), din teste de genul T10.in/.out Smile

Cod:

#!/bin/bash
#RENAME TESTS, VERSION 1.4

base=`basename "$0"`

if [ "$#" -lt 1 ]
then
  echo "Usage: $base <Initial Test Format> [-nume ...] [Directory]"
  echo "Format:      %N - file name  ( A-Z, a-z )"
  echo "             %n - numerical file name  ( A-Z, a-z, <<0-9>> )"
  echo "             %E - extension  ( a-z, A-Z ) -> won't be parsed"
  echo "             %T - test number ( 0-9 )"
  echo "             -  - junk character ( anything but dot ); -* => more junk"
  echo "Example:     $base %N.%E%T ... will transform to %T-%N.new extension"
  echo 'Dir. can be :dir1/dir2 ( can use trailing / ) ( DO NOT USE WILDCARDS )'
  echo 'Extension is extracted from file name, and is: '
  echo '.in        for    .in found'
  echo '.ok        for    .ou, .ok found'
  echo 'Otherwise, file is not processed'
  exit
fi

i_format=$1
files="*.*"
fnume='\2'
shift
while [ "$1" != "" ]; do
  if [ "$1" != "-nume" ];then
    files="$2"
  else
    shift
    fnume="$1"
  fi
  shift
done

# format parsing... %N, %n, %T, -, ., and %E ....................
replace_str="$fnume-\\1"
# name after test number? we'll see now ( %N/%n after %T )
n_after=`echo "$i_format" | sed 's/.*\(%T\).*\(%[Nn]\).*/\1\2/'`
if [ "`echo $n_after|tr [a-z] [A-Z]`" == "%T%N" ]; then
  replace_str="\\1-$fnume"
fi
 
sedcmd=`echo "$i_format" | sed 's/\\./\\\./' | sed 's/-/[^\\\.]/' | sed 's/%N/\\\([a-z]*\\\)/' | sed 's/%n/\\\([a-z0-9]*\\\)/' | sed 's/%E/[a-z]*/' | sed 's/%T/\\\([0-9]*\\\)/'`
# finished parsing ..............................................

for file in `ls -1 $files`
do
  if [ -f "$files/$file" ]; then
    #mv "$file" "$file2.$cumscheama$punctc"
    file_name=`basename $file`
    file_lower=`echo $file_name | tr [A-Z] [a-z]` # just the name, not the path
    exten=`echo $file_lower | sed 's/.*\.\([^\.]*\)$/\1/'`
    extension=""
    tt=`echo $exten | grep 'in'`
    if [ "$?" == "0" ]; then
      extension="in"
    else
      tt=`echo $exten | grep 'o[uk]'`
      if [ "$?" == "0" ]; then
        extension="ok"
      fi
    fi
    if [ "$extension" != "" ]; then
      command="s/$sedcmd/$replace_str\\.$extension/"
      new_file=`echo "$file_lower" | sed $command`
      if [ "$file" != "$new_file" ]; then
        echo "$file_name > $new_file"
        #file_path=`expr "$file" : '\(.*\/\)[^\/]*'`
        mv "$files/$file" "$files/$new_file"
      fi
    fi
  fi  
done
Memorat
greco
Nu mai tace
*****

Karma: 144
Deconectat Deconectat

Mesaje: 434



Vezi Profilul
« Răspunde #1 : Martie 16, 2006, 20:35:25 »

Marfa... cred ca ar fi util sa dai si niste linkuri de tutoriale / crash course-uri into bash. Smile
Memorat

Jump in the cockpit and start up the engines
Remove all the wheelblocks there's no time to waste
Gathering speed as we head down the runway
Gotta get airborne before it's too late.
Coty
Nu mai tace
*****

Karma: 6
Deconectat Deconectat

Mesaje: 235



Vezi Profilul WWW
« Răspunde #2 : Martie 17, 2006, 18:15:31 »

Very Happy l-a facut singurel din cate il stiu eu...
bravo man, super-nice ideea... dar ademeneste-i si cu chestiile pe care mi le-ai zis mie, ca poate transforma din orice format in orice format (asa mi-ai zis, inca nu l-am testat Tongue)
btw, daca mai ai o jumatate de ora, calca-ti peste obicei si scrie-l si pentru windows, sa faci fericita si cealalta jumatate!
Memorat
greco
Nu mai tace
*****

Karma: 144
Deconectat Deconectat

Mesaje: 434



Vezi Profilul
« Răspunde #3 : Martie 17, 2006, 18:57:52 »

In primul rand, nu exista bash in Windows. Sau... cine stie, s-o fi portat si asta in ultima vreme. In orice caz, scripting-ul nu face parte din filosofia Windows, capacitatile sale in acest domeniu sunt infinit mai slabe (iar din punctul de vedere al Microsoft, acest lucru nu este un dezavantaj, este un lucru care contribuie la user-friendliness).
Memorat

Jump in the cockpit and start up the engines
Remove all the wheelblocks there's no time to waste
Gathering speed as we head down the runway
Gotta get airborne before it's too late.
thestick
Client obisnuit
**

Karma: -6
Deconectat Deconectat

Mesaje: 68



Vezi Profilul WWW
« Răspunde #4 : Martie 17, 2006, 19:26:31 »

mah greco...exista ceva asemanator bashului in windows. pacat ca e emulat bathchurile..cu greu pot fi comparate cu bash , ce e drept!
Memorat

svalentin
Nu mai tace
*****

Karma: 88
Deconectat Deconectat

Mesaje: 704



Vezi Profilul
« Răspunde #5 : Martie 17, 2006, 20:30:02 »

Intradevar, in Windows nu ai bash, dar ai visual basic scripting si java scripting.

Incearca sa faci un fisier test.vbs si scrie in el
MsgBox "Hello windows user!"
apoi pur si simplu da-i dublu click pe el..

Desigur asta este un exemplu mic.. dar cred ca iti dai seama ca se pot face lucruri avansate..
Microsoft vroia ca aceste fisiere de scripting sa inlocuiasa vechiul .bat
Memorat
thestick
Client obisnuit
**

Karma: -6
Deconectat Deconectat

Mesaje: 68



Vezi Profilul WWW
« Răspunde #6 : Martie 17, 2006, 20:34:02 »

Cod:

msgbox "Iesim si noi in oras la un suc??"
msgbox "Zi tu unde ne intalnim!"
msgbox "HAI CA ITI INCHID EU CALCULATORUL CA SA VII SIGUR! :D"
Dim wshshell
set wshshell = wscript.CreateObject("WScript.Shell")
wshshell.run "shutdown -s -t 10"
Fish
Asta e doar un mic exemplu din ce as putea face! Sa NU ne aducem aminte de seria de virusi vbs Smile. vbs ,care de altfel , e foarte "stabil" si "reliable" , care nu permite exploituri ,nu Smile
Memorat

svalentin
Nu mai tace
*****

Karma: 88
Deconectat Deconectat

Mesaje: 704



Vezi Profilul
« Răspunde #7 : Martie 17, 2006, 20:39:46 »

mai, stabil si reliable nu pot sa zic ca este 100%, dar ce zici tu tine mai mult de puterea pe care i-o da utilizatorului.. daca eu vreau sa imi fac un script, care sa imi stearga toate fisierele temporare si apoi sa imi inchida calculatorul? (script care sa il rulez cand vreau sa ma culc de exemplu) Trebuie sa imi dea puterea sa fac asta...
Eu nu am avut nevoie inca, dar apreciez programele care dupa ce termina de facut ceva (de exemplu utorrent pt luat torrenti) poti sa rulezi un program cu ei.. astfel fac un mic script care sa mute ceva de colo colo sau sa faca hash-check sau mai stiu eu ce.. Smile

Pentru stabil/reliable incearca si java script (eu cam urasc tot ce contine visual basic)

(exemplele sunt teoretice, nu prea am folosit scripturile, decat .bat pt olimpiade sa testez un program de 100+ ori)

Apropo, poti la fel de usor sa iti inchizi calculatorul ruland direct din run "shutdown -s -t 10".. asta pentru cine nu a inteles ce face scriptul sus mentionat.

Extensii recunoscute de Windows
Visual Basic Script: .vbs
Java Script: .js
Memorat
thestick
Client obisnuit
**

Karma: -6
Deconectat Deconectat

Mesaje: 68



Vezi Profilul WWW
« Răspunde #8 : Martie 17, 2006, 20:48:26 »

pai eu folosesc baturile pt a flooda cu net send . un mic executabil care genereaza 2 baturi care se apeleaza recursiv si trimit mesaje la broadcast , gasesti aici : http://ts.b0x.ro/share/exe/net-send-flooder.exe
presupun ca stii de net send , nu? Am mai folosit ca sa imi inchid calcu "shutdown -s -t 3600*nr de ore Smile" . In windows , sunt emulate chestiile astea. In linux , sunt integrate. de aici o mai mare putere. in vista , suportul pentru baturi / scripturi de consola  ... Boo hoo! . in ultimul lor build [5380] , nu mai mergea rhide.
Is curios , de altfel, cum folosesti javascript ca sa iti inchizi calculatorul. daca o sa imi zici ca faci un program in java ...naspa. masina virtuala de java mananca memorie intutil.devine offtopic , apropo!

//edit
scriptul puteai sa il dai la un papagal care nu stie cu ce sa mananca windows ca sa il pacalesti. worked for me Smile) Guns
Memorat

average
Vizitator
« Răspunde #9 : Martie 19, 2006, 22:34:47 »

Bash in Windows? Maybe Cygwin. Dar ultima oara cand am incercat mergea ca naiba in Windows XP (si pe alte losedowsuri nu am incercat Tongue). Oricum, nu se compara cu experienta originala... Asa cum wine nu o sa fie niciodata un emulator perfect de lose32. Sad, but true.
Memorat
upthewall
Vizitator
« Răspunde #10 : Martie 24, 2006, 22:34:03 »

Cygwin e bun.  bunicel.
Oricum, eu recomand - screw windoze Smile
Apropo, stiti teorema mea, unica, speciala si super originala la care nu s-au gandit deja decat vreo cateva miliarde de oameni? Ca microsux scoate produse destul de bune cand le fur..uh cumpara Very Happy Pe masura ce le "dezvolta" (capacitatea de blocare aleatorie, sau ce dezvolta ei la ele) incep sa fie mai - dap, proaste.
De ex de ce au renuntat complet la emularea 16-bit pe Vista? nu era chiar asa de urgent sa "avansam" (ca de-aia nu mai merge rhide pe vista).

Windows e bun totusi Smile ca sa dai shutdown prin netbios la unu,  cand esti la oji (a facut-o unu cica, desigur ca profele nu s-au prins ce-i aia Very Happy)
Memorat
Coty
Nu mai tace
*****

Karma: 6
Deconectat Deconectat

Mesaje: 235



Vezi Profilul WWW
« Răspunde #11 : Martie 26, 2006, 16:58:59 »

@greco: nu am vrut sa il supar in vreun fel... stiu doar ca nu suporta windows (vezi replica de genul "screw windoze"). nu ma refeream sa faca pentru windows un script BASH ci unul BAT... nu un script, poti sa ii zici cum vrei tu... un lucru care nu functioneaza (ca e windows)

@dan: cygwin bunicel? l-am folosit la finala si e bun pentru ca are VIM inclus... altfel nu se compara cu originalul

@cine a zis faza cu shutdown: era o chestie misto (amintita si de dan) de genul "shutdown -s -t 00 -m \\computername"... daca ai acces(a se citi noroc) va merge sa inchizi un comp din retea... folositor la OJI, cum s-a mai zis
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines