Ukazno programiranje
DubleG
Član
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.
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
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
#!/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
č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...
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
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
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.
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
...
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.
if [ -f $i ];then tole reši zadevo:)
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
Celotna navodila http://pastebin.com/m606e8a0c
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.
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
tkole nekak:
$ najnovejsa /usr/etc
/usr/etc/httpd/httpd Oct 25 12:16
hvala, lep dan
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-)