Sie sind nicht angemeldet.

DeaD_EyE

Administrator

  • »DeaD_EyE« ist der Autor dieses Themas

Beiträge: 3 980

Wohnort: Hagen

Beruf: Mechatroniker (didaktische Systeme)

Rootserver vorhanden: Nein

  • Nachricht senden

1

Montag, 3. Januar 2011, 19:58

1337 beim Scripten

Ich bin gerade dabei ein Script zu schreiben und versuche anhand einer Exclude-File-List bestimmte Dateien auszuschließen. Dabei kam folgendes heraus:

Quellcode

1
2
3
4
server@*****:~/publicserver/cssfun$ diff <(find) <(cat ~/serverfiles/css.txt) | wc -l
1365
server@*****:~/publicserver/cssfun$ diff <(find) <(cat ~/serverfiles/css.txt) | grep '^< ' | wc -l
1337


Sooo leet.
Naja, hab noch nicht ganz das Ergebnis was ich eigentlich haben wollte big-lol

EDIT: Geht so wie ich es wollte :-)

Quellcode

1
 diff <(cat ~/serverfiles/css.txt) <(find -type f) | grep '^> ' | sed 's/^> //' | egrep '/orangebox/cstrike/maps/|/orangebox/cstrike/materials/|/orangebox/cstrike/sound/|/orangebox/cstrike/models/' | grep -v '.ztmp$'


Viele können sich sicher jetzt schon denken was ich damit vorhabe...

Koffein

Fortgeschrittener

Beiträge: 353

Rootserver vorhanden: Nein

  • Nachricht senden

2

Montag, 3. Januar 2011, 22:56

Re: 1337 beim Scripten

Sieht aus wie ein Backup Script für /maps /models /sounds,
die dann als gepackte Datei gespeichert wird, oder ? :D

Kathy

Fortgeschrittener

Beiträge: 523

Wohnort: München

Beruf: Roaster/Freelance Editor

Rootserver vorhanden: Ja

  • Nachricht senden

3

Montag, 3. Januar 2011, 22:58

Re: 1337 beim Scripten

amazing 1337ness


NTcgNjggNmYgNjEgMmUgMjAgNDQgNjUgNmEgNjEgMjAgNzYgNzUgMmU=

Wer weiss was das ist?

4

Dienstag, 4. Januar 2011, 00:23

Re: 1337 beim Scripten

Backup weniger, da auf dem System wohl Symlinks eingesetzt werden und man deswegen keine Dateiliste bräuchte, um zu differenzieren.

Da ich bereits so was Ähnliches in meinem Webinterface eingebaut habe, würde ich mal auf ein Fast Download Skript tippen ;)
Webbasierender Config Ersteller: www.ulrich-block.de für CS 1.6, CSS, DODS und TF2.

Ebenso wird werden verschiedene Debian Gameserverkernel zum Download angeboten.

DeaD_EyE

Administrator

  • »DeaD_EyE« ist der Autor dieses Themas

Beiträge: 3 980

Wohnort: Hagen

Beruf: Mechatroniker (didaktische Systeme)

Rootserver vorhanden: Nein

  • Nachricht senden

5

Dienstag, 4. Januar 2011, 11:46

Re: 1337 beim Scripten

Jo, nur eins, dass auch bei ganz normalen Server ohne Symlinks funktioniert.
Leider gibt es keinen Weg die Exclude-File-List direkt bei find mit einzubinden. Dann müsste ich nicht den Weg über diff gehen.

MadMakz

Super Moderator

Beiträge: 1 878

Wohnort: ~#

Rootserver vorhanden: Ja

  • Nachricht senden

6

Dienstag, 4. Januar 2011, 23:37

Re: 1337 beim Scripten

als ich den titel gelesen hatte viel mir irgendwie direkt http://lolcode.com/">http://lolcode.com/</a> ein XD

Beiträge: 2 498

Wohnort: Schwelm

Beruf: Immobilien-Verwalter / Serveradministrator

Rootserver vorhanden: Nein

  • Nachricht senden

7

Dienstag, 4. Januar 2011, 23:52

Re: 1337 beim Scripten

Das sind so Themen, wo bei mir ganz viele :?: :?: :?: vor den Augen erscheinen.

Kathy

Fortgeschrittener

Beiträge: 523

Wohnort: München

Beruf: Roaster/Freelance Editor

Rootserver vorhanden: Ja

  • Nachricht senden

8

Mittwoch, 5. Januar 2011, 18:44

Re: 1337 beim Scripten

Genau das... LOLBASH.sh


NTcgNjggNmYgNjEgMmUgMjAgNDQgNjUgNmEgNjEgMjAgNzYgNzUgMmU=

Wer weiss was das ist?

9

Samstag, 8. Januar 2011, 11:19

Re: 1337 beim Scripten

Etwas spät, aber besser, als nie. Ich suche nicht positiv nach Ordnern, sondern schmeiße negativ alles raus, was nicht passt. Das mache ich, weil ich mein Programm/Skript für möglichst viele Arten von Servern einsetzen will.
Der Pattern dafür ist:

Quellcode

1
".inf\|.log\|.txt\|.cfg\|.vdf\|.cache\|.dem\|.db\|.dat\|.ztmp\|log\|logs\|download\|downloads\|DownloadLists/\|metamod/\|amxmodx/\|hl/\|hl2/\|cfg/\|addons/\|bin/\|classes/"
Webbasierender Config Ersteller: www.ulrich-block.de für CS 1.6, CSS, DODS und TF2.

Ebenso wird werden verschiedene Debian Gameserverkernel zum Download angeboten.

DeaD_EyE

Administrator

  • »DeaD_EyE« ist der Autor dieses Themas

Beiträge: 3 980

Wohnort: Hagen

Beruf: Mechatroniker (didaktische Systeme)

Rootserver vorhanden: Nein

  • Nachricht senden

10

Samstag, 8. Januar 2011, 13:10

Re: 1337 beim Scripten

wieso schmeißt du denn vdf raus?

Chrisber

Administrator

Beiträge: 1 030

Wohnort: localhost

Rootserver vorhanden: Ja

  • Nachricht senden

11

Samstag, 8. Januar 2011, 13:41

Re: 1337 beim Scripten

http://chrisber.de/HQ9pp.txt">http://chrisber.de/HQ9pp.txt</a>
Zählt das auch :P ?
Und das letzte, was gesagt wird, wenn die Welt untergeht, ist: das ist technisch unmöglich.

12

Samstag, 8. Januar 2011, 13:57

Re: 1337 beim Scripten

Weil eine vdf auf dem fastdownload nichts zu suchen hat. Die sollte zwar schon zwar durch addons abgedeckt sein, aber manche Leute laden so etwas ja auch in andere, falsche Ordner hoch. Damit das dann nicht mit hoch geladen wird, habe ich sie in meiner Liste.
Webbasierender Config Ersteller: www.ulrich-block.de für CS 1.6, CSS, DODS und TF2.

Ebenso wird werden verschiedene Debian Gameserverkernel zum Download angeboten.

DeaD_EyE

Administrator

  • »DeaD_EyE« ist der Autor dieses Themas

Beiträge: 3 980

Wohnort: Hagen

Beruf: Mechatroniker (didaktische Systeme)

Rootserver vorhanden: Nein

  • Nachricht senden

13

Samstag, 8. Januar 2011, 15:57

Re: 1337 beim Scripten

Ach, lol hab mich vertan. Ich hab jetzt vdf mit vtf verwechselt. Hättest das nicht erklären müssen. War noch nicht so ganz wach.

Ich hab zur Zeit ein ganz anderes Problem. Ich möchte mir mit einer Funktion einen Teil für den Befehl find zusammenbasteln. Oben trägt man nur die Dateitypen ein. Man kann die Dateien zwar erst alle suchen und dann greppen, was letzendlich bei vielen Dateierweiterungen länger dauert. Um das ganze zu optimieren, habe ich halt diese Funktion geschrieben:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bz2include() {
        if [ $# = 1 ]; then
                echo -n "-name *.$1"
                return
        fi

        output="\( -name \*.$1"
        shift
        for type in $@; do
                output="$output -o -name \*.$type"
                shift
        done
        output="$output \)"
        echo -n "$output"
        return
}


Dann halt festlegen welche Dateien erlaubt werden sollen (ginge natürlich auch anders herum):

Quellcode

1
bz2_include_filetypes="nav bsp mp3 wav vtf mdl txt"

txt-Dateien habe ich absichtlich mit reingenommen, da ich die Funktionalität testen wollte. Gerade beim Globbing der Shell kommen komische Sachen zustande. Wenn Dateien mit der Endung .txt im gleichen Verzeichnis sein, kommt es zum Fehler, da das Globbing der Shell *.txt durch die Dateien ersetzt, die sich im gleichen Verzeichnis befinden. Dadurch wäre der Befehl find -name *.txt ungültig. Man kann entweder das Globbing mit einem Backslash verhindern oder den Text Quotieren ("" oder mit ''). Leider geht das so nur, wenn man das so im Shell-Script direkt eingibt und nicht mit Variablen arbeitet. Hab auch schon Probiert den Find-Befehl in die Funktion mit reinzunehmen und direkt mit der Variable output zu arbeiten.

Hier der Funktionsaufruf, der nicht geht:

Quellcode

1
2
find $(bz2include $bz2_include_filetypes) #Fehler, wenn ich die Klammern aus der Funktion nehme, geht es
include="$(bz2include $bz2_include_filetypes)"; find $include #Geht natürlich auch nicht.


Die Ausgabe sähe so aus:

Quellcode

1
\( -name \*.nav -o -name \*.bsp -o -name \*.mp3 -o -name \*.wav -o -name \*.vtf -o -name \*.mdl -o -name \*.txt \)


In mehreren Versuchen habe ich es auch mal ohne Klammern gemacht, welche die Expression eigentlich nur zusammenfassen:

Quellcode

1
-name \*.nav -o -name \*.bsp -o -name \*.mp3 -o -name \*.wav -o -name \*.vtf -o -name \*.mdl -o -name \*.txt


Hingegen funktioniert dieser Aufruf:

Quellcode

1
bash -c "find /home/server/bash_test $(bz2include $bz2_include_filetypes)"


D.h. wenn ich mit echo oder einer Variable etwas in einem Shell-Script übergebe, wird der Backslash ganz anders interpretiert. Erstelle ich die Datei '*.txt' (Mit Hochkommatas, hatte ja länger rumprobiert), wird diese gefunden. Um sicher zu gehen, habe ich alle drei Varianten getestet. '*.txt', "*.txt" und \*.txt
Mit bash -c "...." funktioniert es, da dort wieder der Backslahs das Globbing verhindert aber nicht vom Befehl find als extra Zeichen mit interpretiert wird.

So, jetzt die große Preisfrage. Wie bekomme ich das Script so hin, dass es funktioniert, ohne den Befehl bash -c verwenden zu müssen. Ich will auch nicht mit grep arbeiten, da es einfach langsamer ist und ich damit nicht das erreiche, was ich eigentlich vorhatte. Mit grep kann doch jeder...

Was ich so witzig finde, dass find -name "*.txt" langsamer ist als find | grep '.txt$'. Nimmt man hingegen mehrere Dateiendungen wird die Ausführungszeit durch grep immer lansgamer, wogegen der Befehl find mit einer recht konstanten Geschwindigkeit sucht.

Ich muss mich jetzt erstmal auf etwas anderes konzentrieren. Wenn man zulange eine Sache macht, dann sieht man irgendwann den Wald vor lauter Bäumen nicht.

EDIT: Ich hab es jetzt erstmal mit grep realisiert

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
bz2_include_filetypes="nav bsp mp3 wav vtf mdl txt"
#bz2_include_filetypes="nav"

bz2include() {
        if [ $# = 1 ]; then
                grep ".$1$"
                return
        fi

        output=".$1$"
        shift
        for type in $@; do
                output="$output|.$type$"
                shift
        done
        egrep "$output"
        return
        }

find | bz2include $bz2_include_filetypes| while read file; do
        bzip2 -kv $file
done

DeaD_EyE

Administrator

  • »DeaD_EyE« ist der Autor dieses Themas

Beiträge: 3 980

Wohnort: Hagen

Beruf: Mechatroniker (didaktische Systeme)

Rootserver vorhanden: Nein

  • Nachricht senden

14

Mittwoch, 2. Februar 2011, 22:14

Re: 1337 beim Scripten

Bin endlich drauf gekommen, nachdem ich die Sache nochmals angegangen bin. Mit evaluate geht es.

Quellcode

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
#!/bin/bash
exclude_filetypes="txt sh bin"
include_filetypes="txt bin sh"
findexclude() {
    	if [ $# = 1 ]; then
            	echo "-not -name "*.$1""
            	return
    	fi

    	output="-not \( -name "*.$1""
    	shift
    	for type in $@; do
            	output="$output -o -name "*.$1""
            	shift
    	done
    	output="$output \)"
    	echo "$output"
    	return
    	}

findinclude() {
    	if [ $# = 1 ]; then
            	echo "-name "*.$1""
            	return
    	fi

    	output="\( -name "*.$1""
    	shift
    	for type in $@; do
            	output="$output -o -name "*.$1""
            	shift
    	done
    	output="$output \)"
    	echo "$output"
    	return
    	}

exclude="$(findexclude $exclude_filetypes)"
include="$(findinclude $include_filetypes)"
echo "Pattern for exclude: $exclude"
echo "Pattern for include: $include"
echo
echo "Searching files with exluding some filetypes: $exclude_filetypes"
eval find $exclude
echo
echo "Searching files with including some filetypes: $include_filetypes"
eval find $include

echo
echo "Find only real files: -type f (with excluding other files)"
eval find -type f $exclude