Ukazno programiranje

Zanima me, kako storiti:

Kot argument k skripti dobim direktorij, v njem pregledam vse *.txt datoteke in izpišem ime najmanjše in koliko znakov vsebuje. Če argumenta k skripti ne dobim, izpišem navodila.


#!/bin/bash +x

if [ -z \"$1\" ]; then
echo uporaba: $0 imenik
exit
fi


INPUT=$1/Test.txt

stevec=0
while IFS= read -r -n1 char
do

(( stevec++ ))
done < \"$INPUT\"
echo $stevec



Ta zadeva mi trenutno pregleda samo eno datoteko in še to moram napisat... Vem kako se napiše filter da mi izpiše vse txt datoteke (ls *.txt)... Mogoče nisem niti na pravi smeri, zato prosim za pomoč.

lp

Komentarji

  • Potrebuješ še for zanko, nekaj takega:

    for i in \"tvoj_direktorij\"*.txt;
    do

    ...

    done
  • evo, da se ne bos matral, sm se jst namesto tebe

    #!/bin/bash
    minLength=256
    imeBesede=""
    for i in `ls -l *.txt`
    do
    for j in `echo $i | grep .txt`
    do
    stevec="`echo $j | awk '{print length - 4}'`"
    if (("$stevec" <= "$minLength"))
    then
    let minLength=$stevec
    imeBesede=$j
    fi
    done
    done
    echo "Najkrajsa datoteka z .txt koncnico je: "$imeBesede , ki ima dolzino $minLength znaka
  • No hvala. Ker pa bi se rad naučil bi še kakšno vprašal:)

    če mi spremenljivka i predstavlja vse datoteke v direktoriju, ki ga moram dobit kot parameter. kako naj spremeljivko temp=(shranem vedno znova drug TXT fajl)? V bistvu bi moral imeti tudi nek filter da bi shranjeval samo txt datoteke...

    temp=`file -b $1/$i`
    Tole mi ne deluje vredu...
  • v tem programu ki sem ti ga podal, i ne shranjuje datoteke, ampak vsak niz znakov posebej.
    primer
    ls -l *.txt izpise drwxrwxrwx 8 user user 4096 2009-10-12 11:02 imeDat.txt
    medtem ko imamo v spremenljivki i naslednje stvari
    drwxrwxrwx
    8
    user
    user
    4096
    2009-10-12
    11:02
    imeDat.txt

    za lazje razumevanje si za vsak i in j, ali pa kaksno drugo spremenljivko ki bi rad videl kaj vsebuje dodaj:
    echo $imeSpremenljivke

    kar se pa tice ime datoteko, to naredimo z ukazom for j in `echo $i | grep .txt`
    grep .txt pomeni da bo iskal vsak niz znakov, ki bo vseboval ".txt" znake

    program bi se dalo se lazje napisat, sm skor preprican da samo s eno for zanko shranimo ali izpisemo
  • DubleG Član
    uredil/-a 22. October, 2009
    Če dam ukaz:

    for i in `ls -l *.txt $1`
    do
    for j in `$1/$i | grep .txt`
    do
    echo $j
    done
    done


    Izpiše neke stvari, ki niso pomembne za nalogo.

    Čeprav je v direktoriju $1 home/ino/OS, ki sem ga dal kot parameter samo štiri datoteke, a.txt,b.txt,c.txt,d.txt
  • tale tvoj prvi for sploh ne dela pravilno
    probaj v termianlu vpisat notr ls -l *.txt home/ino/OS" in bos videl kaj ti bo izpisalo
    izvede ti dve zahtevi
    najprej ti izpise ce vsebuje mapa .txt datoteke, nato pa ti se izpise celotno vsebino mape

    jst si vcasih tako pomagam pri bashu, da ks kopiram moj ukaz ki ga napisem v bah programu v terminal, ter pogledam kako in kaj izvede.
  • DubleG Član
    uredil/-a 22. October, 2009
    Ne vem v čem je finta ampak.
    stevec="`echo $j | awk '{print length - 4}'`"
    To mi ni dajalo pravih rezultatov.

    Zdaj mi končno prebere pravilno število znakov v datoteki.

    stevec=`wc -c $j| gawk '{ print $1 }'`

    Hvala, da mi pomagaš!

    Imam še tri probleme, ker mi wc -c vrne število in ime datoteke, z gawk izloščim samo število... Problem je ker gawk ne bi smel uporabiti, obstaja kaka alternativa?

    Potem pa drugič in tretjič, namreč če zaženem ./povprecje.sh ./
    ali ./povprecje.sh /usr mi ne najde direktorija. Kje bi bil problem?

    Direktorij v katerem naj preglejuje txt datoteke podam k skripti kot argument, in ga shranem seveda v $1, ker pa nisem znal drugače, pa se pred vso kodo preglejevanja pomaknem v ta imenik
    cd $1
    ...
  • stevec="`echo $j | awk '{print length - 4}'`"
    tole ti vrne dolzino niza.
    14 je zato, ker imamo pri .txt 4 znake, in sem jih odstel

    hm, ... Meni je program vredu delal, samo je pa res da sem ga stestiral zelo hitro :)

    P.S. Ce hoces ti lahko celoten program komentiram, ce ti bo lazje za razumeti ...

    L.P.
  • DubleG Član
    uredil/-a 23. October, 2009
    Sem se zmotil pri navodilu. Katerokoli zbirko v direktoriju ki ga podam kot argument moram preštet znake v besedilu..:)


    if [ -f $i ];then tole reši zadevo:)
  • potem pa samo tole spreminjas
    for j in `echo $i | grep .txt`
    in namesto .txt dodajas kar hoces
    se boljse pa je da namesto .txt das prvi al pa drugi argument, ki ga podas ;)
  • DubleG Član
    uredil/-a 19. November, 2009
    Ne vem če je smiselno odpirat novo temo. Bodo o tem odločili moderatorji. Zdaj bom pa napisal tukaj.

    Celotna navodila http://pastebin.com/m606e8a0c

    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <stdlib.h>

    int main(int argc, char **argv)
    {int i;
    pid_t pID;
    int vsota_oce=0;
    int vsota_sin=0;
    if (argc == 1)
    {
    printf(\"Podati morate argument!\n\");
    }
    else
    {
    int stevec=atoi( (argv[1]) );
    for(i=1;i<=stevec;i++)
    {
    pID=vfork();
    vsota_oce=vsota_oce+i;
    //printf(\"PID:%d; PPID:%d\n\", getpid(), getppid());
    if (pID==0)
    {
    vsota_sin=vsota_sin+i;
    }
    else
    {
    wait(&pID);}
    }
    }

    printf(\"Vsota, ki jo izračuna oče:%d\n\", vsota_oce);
    printf(\"Vsota, ki jo izračunajo sinovi:%d\n\", vsota_sin);
    return 0;}


    Ne razumem zakaj mi na koncu izpiše pravilen rezultat, zraven pa še nekaj:

    Vsota, ki jo izračuna oče:15
    Vsota, ki jo izračunajo sinovi:15
    Vsota, ki jo izračuna oče:528563841
    Vsota, ki jo izračunajo sinovi:520402191
    vsotast: cxa_atexit.c:100: __new_exitfn: Assertion `l != ((void *)0)' failed.
  • DubleG Član
    uredil/-a 19. November, 2009
    Tega stavka v navodilih tudi ne razumem:
    V času delovanja sinov, je oče onemogočen in mora počakati, da se vsi sinovi zaključijo.

    Torej moram očetov proces prekiniti?
    else
    {
    _exit(0);}
    }


    V tem primeru, mi vrne samo tole:

    Vsota, ki jo izračuna oče:15
    Vsota, ki jo izračunajo sinovi:15
    Tako mora izgledat tudi pravilen izhod... Ampak ne vem če delam v skladu z navodili... http://pastebin.com/m606e8a0c
  • hej pozdravljeni, bi mi mogoce lahko pomagali pri problemcku...zelim program, ki v lupini, preišče vse datoteke v podanem direktoriju in njegovih poddirektorijih pol pa da bi izpisu najnovejšo datoteko (po datumu zadnje spremembe).

    tkole nekak:

    $ najnovejsa /usr/etc
    /usr/etc/httpd/httpd Oct 25 12:16

    hvala, lep dan
  • evo en namig:


    find /home -printf \"%T@ %p %Tb %Td %TH:%TM\n\" | sort | tail -n 1 | cut -c 23-


    tale ukaz ti naredi tocno kar ti zelis
    find : poišče vse datoteke v datoteki (podani kot argument)
    printf : je stikalo ukaza find, ki namesto default izpisa izpiše:
    - %T@ število sekund od od 1.jan 1970 00:00 do časa zadnje spremembe
    - %Tp izpiše ime datoteke(vključno z potjo)
    - %Tb izpiše mesec zadnje spremembe v formatu (Jan, Feb, Mar,...,Dec)
    - %Td izpiše dan v mesecu zadnje spremembe v formatu (00,01,...,31)
    - %TH izpiše uro zadnje spremembe
    - %TM izpiše minuto zadnje spremembe
    sort -n: ti sortira vse vrstice po numerični vrednosti
    tail -n 1: izbere samo zadnjo vrstico t.j. vrstico z najnovejšo datoteko
    cut -c 23- : izbere samo znake od 23. znaka naprej(izbriše število sekund od od 1.jan 1970 00:00 do časa zadnje spremembe)

    drugače pa malo poglej man find, man sort,... če ti pa še kaj ne bo jasno pa vprašaj.

    #!/bin/bash
    echo $(find $1 -printf "%T@ %p %Tb %Td %TH:%TM\n" | sort -n | tail -n 1 | cut -c 23-)
Za komentiranje se prijavite ali pa se vpišite.