#!/usr/bin/perl # [c] piotao, 20070320, skrypt do porownywania zawartosci dwoch katalogow # na podstawie informacji zwracanej przez polecenie ls -l # Argumenty programu, to dwa wybrane katalogi. Wynikiem dzialania jest # informacja, ktorych plikow brakuje w ktorym katalogu. use strict; use warnings; my $dir1 = shift @ARGV || die "Podaj nazwe katalogu do sprawdzenia!\n"; my $dir2 = shift @ARGV || die "Podaj dwie nazwy katalogow do sprawdzenia podobienstwa!\n"; die "Brak jednego lub dwoch podanych katalogow!\n" if !-e $dir1 or !-e $dir2; # sprawdzamy czy znaleziono polecenie ls (pod windows go nie bedzie :P) my $ls = `which ls`; chomp $ls; die "Brak polecenia ls, ktore moge wykorzystac!\n" unless $ls; # wczytanie listingu z ls dwoch katalogow do tablic wierszy # dodatkowo usuwamy znaki konca wiersza z kazdego wiersza # oraz wyrzucamy pierwszy wiersz zawierajacy liczbe. my @dir1 = `$ls -l $dir1`; chomp @dir1; shift @dir1; my @dir2 = `$ls -l $dir2`; chomp @dir2; shift @dir2; # poniewaz w roznych systemach unixowych polecenie ls moze dawac rozne # wyniki, bedziemy potrzebowali tylko ostatniego elementu z kazdego wiersza # ktorym zwykle jest nazwa pliku. Zatem tablice otrzymane z ls nalezy # przetworzyc na takie, w ktorych po prostu beda nazwy plikow i nic wiecej. # Nie bedziemy zawracac sobie glowy wielkosciami plikow lub ich datami. =comment Wynik dzialania polecenia ls moze wygladac tak: razem 884 -rw-rw-r-- 1 piotao users 86060 lis 27 2003 p00.jpg -rw-rw-r-- 1 piotao users 73135 lis 27 2003 p01.jpg -rw-rw-r-- 1 piotao users 109736 lis 27 2003 p02.jpg -rw-rw-r-- 1 piotao users 110419 lis 27 2003 t00.jpg ... ... =cut # przepisanie list w celu uzyskania tylko nazw plikow @dir1 = map{ (split)[-1] } @dir1; @dir2 = map{ (split)[-1] } @dir2; # aby wygodniej sprawdzic, czy dany plik jest czy nie ma go # w katalogu, mozna skonwertowac tablice plikow na hasze: my %dir1; @dir1{@dir1} = (undef) x @dir1; my %dir2; @dir2{@dir2} = (undef) x @dir2; # teraz nalezy wypisac to czego nie ma w dir2 a jest w dir1 i # odwrotnie, to czego nie ma w dir1 a jest w dir2. foreach (sort keys %dir1){ # dla kazdego elementu z dir1 if(!exists $dir2{$_}){ # jezeli NIE istnieje taki element w dir2 printf " -> %s\n",$_; # wypisz go ze strzalka } } foreach (sort keys %dir2){ # dla kazdego elementu z dir2 if(!exists $dir1{$_}){ # jezeli NIE ma takiego w dir1 printf " <- %s\n",$_; # wypisz go ze strzalka w druga strone } } # i tyle... __END__