Strona 1 z 1
bash --- dwa zadanka?
: 15 kwietnia 2008, 21:41
autor: Green
Witam.
Zostały mi do zrobienia 2 zadanka i nie mogę sobie z nimi poradzić.
1. Napisz skrypt, który w aktualnym katalogu wybierze dwa pliki o najbliższym sobie rozmiarze.
2. Napisz skrypt, który w drzewie podkatalogów aktualnego katalogu wybierze dwa pliki o najbliższym sobie rozmiarze.
Byłbym bardzo wdzięczny za pomoc.
Pozdrawiam.
: 15 kwietnia 2008, 22:30
autor: Inquistor
Do sprawdzenia wielkości możesz użyć
du, opatrzone odpowiednim cutem np.
da Ci wielkosc w bajtach wszytkich plikow z folderu.
Co do porownania... Nie mam w tej chwili żadnego pomysłu
: 15 kwietnia 2008, 23:27
autor: salmon
Green pisze:1. Napisz skrypt, który w aktualnym katalogu wybierze dwa pliki o najbliższym sobie rozmiarze.
Kod: Zaznacz cały
set `find . ! -name . -prune -type f| xargs ls -l|awk '{print $5, $9}'|sort -n`
first_file=''
second_file=''
roznica=99999 #jak najwieksze, a najlepiej zainicjalizowac pierwszymi elemantami
while [ $# -gt 2 ]
do
if [ `expr $3 - $1` -lt $roznica ]
then
first_file=$2
second_file=$4
roznica=`expr $3 - $1`
fi
shift
shift
done
echo $first_file, $second_file
Dla drugiego trzeba zmienic tylko parametry finda.
: 16 kwietnia 2008, 00:18
autor: Green
Dzięki wielkie tylko...
Nie wiem dla czego ale skrypt bierze pod uwagę wszystkie pliki, razem z ukrytymi :/ Jak znajdzie jakiś pierwszy plik to drugi jest najbliższy "w górę" czyli np. jak znajdzie plik o rozmiarze 33 to kolejny będzie np. 100 (i to jest najbliższy większy plik) ale jest też plik np. 30 :/
I czy mógłby mi ktoś opisać dokładnie działanie tego skryptu oraz wytłumaczyć mi działanie funkcji "find" i jak ona by wyglądała w 2`gim przykładzie. Pierwszy raz się z nią spotkałem.
Z góry wielkie dzięki za pomoc

: 16 kwietnia 2008, 01:21
autor: salmon
Green pisze:skrypt bierze pod uwagę wszystkie pliki, razem z ukrytymi
A czemu nie mialby brac pod uwage wszystkich plikow?
Green pisze:Jak znajdzie jakiś pierwszy plik to drugi jest najbliższy "w górę" czyli np. jak znajdzie plik o rozmiarze 33 to kolejny będzie np. 100 (i to jest najbliższy większy plik) ale jest też plik np. 30 :/
Nie rozumiem o co Ci chodzi, wytłumacz to inaczej, a najlepiej pokaż na przykładzie co jest nie tak
I czy mógłby mi ktoś opisać dokładnie działanie tego skryptu oraz wytłumaczyć mi działanie funkcji "find" i jak ona by wyglądała w 2`gim przykładzie. Pierwszy raz się z nią spotkałem.
Chętnie wytłumaczę, ale jutro wieczorem, tylko uprzedzam, że nie jestem guru w tej dziedzinie

: 16 kwietnia 2008, 09:53
autor: Green
Jeszcze takie inne pytanko na szybko.
Na uczelni wywala mi takie coś:
Kod: Zaznacz cały
expr: non-numeric argument
skrypt7.1.txt: line 8: [: -lt: unary operator expected
: 16 kwietnia 2008, 21:10
autor: salmon
Zamień odpowiednią linię na tą:
Kod: Zaznacz cały
set `find . ! -name . -prune -type f -printf '%s %p\n'|grep ^[0-9]|sort -n`
Jeżeli nie chcesz wyszukiwać ukrytych plików to pierwszą kropkę w tym wyrażeniu zamień na "*", jeżeli chcesz przeszukiwać katalogi rekurencyjnie to usuń "-prune".
Tu masz skomentowany program:
Kod: Zaznacz cały
#!/bin/sh
#Przy pomocu 'find' wyszukujemy wszystkie pliki w katalogu i wyswietlamy je w formacie: 'rozmiar nazwa',
#'grep' usuwa wszystkie linie z błędami(nie zaczynające się od cyfry), 'sort' sortuje pliki od najmniejszego
# 'set' ustawia wynik tego programu jako parametry skryptu
set `find . ! -name . -prune -type f -printf '%s %p\n'|grep ^[0-9]|sort -n`
first_file=''
second_file=''
roznica=99999 #jak najwieksze, a najlepiej zainicjalizowac pierwszymi elemantami
#wykonujemy petle dopki liczba parametrow jest wieksza od 2
while [ $# -gt 2 ]
do
#sprawdzamy czy roznica rozmiarow dwoch plikow jest mniejsza od zapisanej
if [ `expr $3 - $1` -lt $roznica ]
then
first_file=$2
second_file=$4
roznica=`expr $3 - $1`
fi
#wyrzucamy pierwsze slowo(rozmiar i nazwa), i sprawdzamy nastepne
shift
shift
done
echo $first_file, $second_file
Co do szczegółoweg znaczenia konkretnych komend odsyłam do manuali (polecenia man)