Thread Shell-Error durchs benutzen von `` (36 answers)
Opened by FlorianL at 2008-01-21 15:12

FlorianL
 2008-01-24 13:40
#105096 #105096
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/perl
use strict;
use Data::Dumper;

my $filespath = "/home/re17830/chksize/checksize_db/";

if (defined $ARGV[0]) {} else {
                print("Error: No argument\n\nUsage: checksize <path> <day>\n");
                exit 0;
}

chomp(my $mountpt = $ARGV[0]);
chomp(my $day = $ARGV[1]);

chomp(my $month = `date +%m`);
chomp(my $premonth = ($month -1));
if ($month == 01) {
        $premonth = 12;
}

chomp(my $year = `date +%y`);
chomp(my $preyear = ($year - 1));

my $file = "$filespath\SizeCheck-$year\-$month\-$day\.dat";
my $monthfile = "$filespath\SizeCheck-$year\-$premonth\-$day\.dat";
my $yearfile = "$filespath\SizeCheck-$preyear\-$premonth\-$day\.dat";

if (-T "$file") {} else {
        $file = "$monthfile";
}

my @fslist = `ls -Rlgo $mountpt`;

my $tmpfile = "/tmp/SizeCheck.tmp";
open(REWRITE, ">$tmpfile");
print REWRITE "$mountpt\:\n";

foreach(@fslist) {
        chomp();
        my @line = split(/ +/);
        if ($line[0] =~ m/^\//g) {
                print REWRITE "\n$line[0]\n";
        } elsif (($line[0] =~ m/^dr/g) || ($line[0] =~ m/^-r/g)) {
                print REWRITE "$line[2]\t\t$line[6]\n";
        }
}

my @diff = `sdiff $file $tmpfile \|egrep \[\:\\\<\\\>\\\|\]`;

my @order;
while( my $line  = @diff ){
   if ( $line =~ m/^(.+):\s+\/.+:$/) {
      push @order, [$1."\n"];
   }
   elsif ( $line =~ m/(^\d+)\s+(.+)\s+(.)\s+(\d+)\s+(.+)\s+$/ ) {
      if ($3 eq "\|") {
         push @{ $order[-1] },"\t$2\t$1\t$4\t" . "Diff: " . abs($1 - $4) . "\n";
      }
      elsif ($3 eq "\<") {
         push @{ $order[-1] }, "\tNew File:\t$5\tSize: $4\n";
      }
      elsif ($3 eq "\>") {
         push @{ $order[-1] },"\tFile deleted:\t$5\n";
      }
   }
}

for( @order ){
   next if @$_ == 1;
   print $_ for @$_;
}


Analog dazu mein hässliches, jedoch funktionierendes shell-perl-script :D

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#Lokation der CheckSize Files
FILESPATH="/home/re17830/chksize/checksize_db/"

if [ ! -d "$FILESPATH" ] ; then
mkdir $FILESPATH
fi

# Commandline Options definieren
if [[ $# -eq 0 ]];then
print "No Arguments given!\n\nUsage: ckecksize <path> <day>"
exit
fi

MOUNTPT=$1
DAY=$2

# Datum definieren
MONTH=`date +%m`
PREMONTH=$(($MONTH -1))
if [ $MONTH -eq 01 ] ; then
PREMONTH=12
fi
YEAR=`date +%y`
PREYEAR=$(($YEAR -1))

# Dateinamen deklarieren
FILE=$FILESPATH\SizeCheck-$YEAR-$MONTH-$DAY.dat

# Bei einer abfrage auf einen Tag wird im Fall das im Aktuellen Monat nichts gefunden wird,
# mit dem Tag des vor-Monats verglichen. (Umgeht das Problem beim Monatswechsel)
if [ ! -f "$FILE" ] ; then
FILE=$FILESPATH\SizeCheck-$YEAR-$PREMONTH-$DAY.dat
if [ ! -f "$FILESPATH\SizeCheck-$YEAR-$PREMONTH-$DAY.dat" ] ; then
if [ ! -f "$FILESPATH\SizeCheck-$PREYEAR-$PREMONTH-$DAY.dat" ] ; then
echo "No Status file found for day $DAY\n"
exit
fi
fi
fi

# Temp-Files anlegen und deklarieren zum re-generieren der Files
cat $FILE |grep -p "^$MOUNTPT" > /tmp/sizecheck.tmp

TMPFILE="/tmp/sizecheck2.tmp"
ls -Rlgo $MOUNTPT > $TMPFILE
# Dieser Perl-Einzeiler gleicht den Output des Temp-Files an den des Status-Files an.
perl -e 'open(FILE, "<'$TMPFILE'"); my @fslist = <FILE>; close(FILE); open(REWRITE, ">'$TMPFILE'"); print REWRITE "'$MOUNTPT':\n"; foreach(@fslist) { cho
mp(); @line = split(/ +/); if ($line[0] =~ m/^\//g) { print REWRITE "\n$line[0]\n"; } elsif (($line[0] =~ m/^dr/g) || ($line[0] =~ m/^-r/g)) { print REWR
ITE "$line[2]\t\t$line[6]\n" } }'

# Der veränderte Output wird in ein Temp-File geschrieben
TMPFILE2=/tmp/sizecheck3.tmp
cat $FILE |grep -p "^$MOUNTPT" > $TMPFILE2

# Vergleich der Files
sdiff $TMPFILE $TMPFILE2 |egrep [:\<\>\|] > /tmp/sizecheck4.tmp

perl -e '
use strict;

sub calcdiff {
my $old = shift;
my $new = shift;
if ($new > $old) {
my $ergebniss_1 = ($new - $old);
return($ergebniss_1);
}
elsif ($old > $new) {
my $ergebniss_2 = ($old - $new);
return ($ergebniss_2);
}
}

my @order;

open(INFILE, "/tmp/sizecheck4.tmp");
while( my $line = <INFILE> ){
if ( $line =~ m/^(.+):\s+\/.+:$/) {
push @order, [$1."\n"];

}
elsif ( $line =~ m/(^\d+)\s+(.+)\s+(.)\s+(\d+)\s+(.+)\s+$/ ) {
if ($3 eq "\|") {
push @{ $order[-1] },"\t$2\t$1\t$4\t" . "Diff: " . &calcdiff("$1","$4") . "\n";
}
elsif ($3 eq "\<") {
push @{ $order[-1] }, "\tNew File:\t$5\tSize: $4\n";
}
elsif ($3 eq "\>") {
push @{ $order[-1] },"\tFile deleted:\t$5\n";
}
}
}

for( @order ){
next if @$_ == 1;

print $_ for @$_;
}

# Aufräumen der Temporären Files
rm /tmp/sizecheck*

View full thread Shell-Error durchs benutzen von ``