Ne, kann bzip2 nicht. Aber find kann das, grep kann das.
Eine fertige Funktion für Dateitypen:
|
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
|
Dann kannst du noch mit Pfaden arbeiten. Anstatt -name kannst du -path verwenden.
z.B. um orangbox/addons zu excludieren = ! -path */orangebox/addons/*
includieren = -path */orangebox/maps/*
Bei Dateilisten wird es schon komplizierter. Wenn ich da mit diff vergleiche, kommt bei vertauschen Zeilen etwas völlig falsches heraus. Find unterstützt soweit ich weiß auch keine Funktion um eine Dateiliste zum excludieren von Suchergebnisen zu verwenden.
Dafür hatte ich mal ein Pythonscript geschrieben, dass zwei Dateien miteinander vergleicht und die identischen Zeilen herausfiltert und nur die hinzugekommen Zeilen der zweiten Datei anzeigt.
So kann man mit mehreren Filtern eine kleine Dateiliste von den Original-Verzeichnissen materials, maps, models, sound, scripts und resource erstellen.
Danach den gleichen Filter auf das Serververzeichnis mit den Customdateien anwenden. Die beiden Dateien vergleicht man dann mit dem Pythonscript und hat dadurch eine Dateiliste mit den customdateien.
Die Dateiliste lässt sich auch so erstellen, dass die Change-/Modifytime dort mit drinsteht. Nachdem ich jetzt sämtliche Server abgesucht habe, meinen alten Homeserver angeschlossen hab usw.. hab ich das Script endlich bei mir auf dem VServer gefunden.
Besonders perfomant ist es nicht, aber es erfüllt seine Aufgabe:
|
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
|
#!/usr/bin/python
'''
./diff.py oldfile newfile
Shows changed/new lines from a new txtfile
Added lines to oldfile doesn't generate output
'''
from __future__ import with_statement
import sys
try:
import psyco
psyco.full()
except ImportError:
# print "Psyco not found :-("
pass
if not len(sys.argv) == 3:
sys.exit()
try:
oldfp = open(sys.argv[1],'r')
old = oldfp.readlines()
oldfp.close()
except IOError:
sys.exit()
try:
newfp = open(sys.argv[2],'r')
new = newfp.readlines()
newfp.close()
except IOError:
sys.exit()
#vorherige Schleife zum Vergleich:
#for new_line in new:
# if not any(old_line in new_line for old_line in old):
# if not len(new_line) <= 1:
# print new_line,
#Der Teil koennte schneller sein.
for new_line in new:
for old_line in old:
if new_line == old_line:
break
else:
if not len(new_line) <= 1:
print new_line,
|
Zum Test hab ich noch psyco importiert, welches den Python-Code schneller machen soll. Unter Debian kann man das Modul mit "apt-get install python-pyco" installieren. Wenn das Modul nicht existiert, wird es auch nicht geladen. Leider bringt die Optimierung nicht viel. Deshalb sollten die beiden Dateilisten auch nur die Dateien aus ausgewählten Verzeichnissen enthalten, damit weniger Zeilen vorkommen.
Der Code ließe sich auch noch optimierten, wenn man aus der Schleife mit break herausspringt, wenn ein Treffer gefunden wurde.
Ich glaube es macht sogar mehr Sinn, das Programm in c zu schreiben... Muss sich nur jemand finden.
Ich hab mal testweise eine Funktion als modul mit cython compiliert. Von 3 Minuten auf 16 sekunden ausführungszeit bei 37000 Zeilen ist schonmal ein Fortschritt.