bash --- dwa zadanka?

Potrzebujesz pomocy z C, C++, perl, python, itp.
Green
Posty: 5
Rejestracja: 05 marca 2008, 18:47

bash --- dwa zadanka?

Post 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.
Awatar użytkownika
Inquistor
Beginner
Posty: 122
Rejestracja: 25 września 2007, 20:48

Post 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
salmon
Beginner
Posty: 296
Rejestracja: 12 października 2007, 23:28
Lokalizacja: Gliwice/Bielsko-Biała

Post 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.
Green
Posty: 5
Rejestracja: 05 marca 2008, 18:47

Post 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 :)
salmon
Beginner
Posty: 296
Rejestracja: 12 października 2007, 23:28
Lokalizacja: Gliwice/Bielsko-Biała

Post 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 :)
Green
Posty: 5
Rejestracja: 05 marca 2008, 18:47

Post 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
salmon
Beginner
Posty: 296
Rejestracja: 12 października 2007, 23:28
Lokalizacja: Gliwice/Bielsko-Biała

Post 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)
ODPOWIEDZ