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.

Kod: Zaznacz cały

du -a | cut -f 1
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)