File-Duplikate in einem Verzeichnis löschen und symbolisch verlinken.

tobiasbeil

Bitchass User
File-Duplikate in einem Verzeichnis löschen und verlinken.

Hallo.

An dieser Stelle wollte ich nur mal kurz
auf meinen Thread bzgl. File-Duplikate
aufmerksam machen.

der Thread ist zu finden hier:

http://www.linuxforen.de/forums/showthread.php?t=186531

Ich dachte mir der eine oder andere AIX User,
der mit NIM etwas zu tun hat könnte dies sehr gut
gebrauchen, um Speicherplatz zu sparen.

Es geht darum FileDuplikate zu identifizieren, löschen,
und dann per symbolische Links wiederherzustellen.
Somit wird die Funktionalität der Filestruktur gewährt,
aber teilweise beachtlich viel Speicherplatz gespart.

Momentan basiert die Duplikat-Ermittlung nach Dateinamen,
ich bin offen für erweiterngen, welche Dateigrösse überprüfen
oder Hashing verwenden, aber das steht alles auch im Thread.

Bye.

EDIT:

An dieser Stelle steht nun immer die neueste Version des Scriptes,
weil ich es leid bin jedesmal nen post zu schreiben, ist ja auch schlecht
zum Thread-lesen/blättern. In diesem Sinne und der Übersicht halber:

Code:
#!/bin/sh

# Description:
# 
# This script will search within the directory it is
# executed in (# sh rmdupl.sh) for files with same
# filename AND same size in bytes AND same MD5 checksum.
# After all those "duplicate" files where found the script
# deletes the duplicate instances and replaces them by
# hardlinks of the appropriate "source" files resulting
# in less physical space requirement while the logical
# functionality of each directory hierarchy is preserved.

# Checking if script is run in root directory. If true,
# script will exit, because it cant handle device files.
# Do not run script in root dir nor uncomment below lines.

pwd=$(pwd)
if [ "${pwd}" = "/" ]
then
	echo 'This script is not applicable on the root directory. Exiting...'
	exit 1
fi

# Setting up working/temporary directory

wd=/tmp/rmdupl
randir=$(echo $RANDOM$RANDOM$RANDOM$RANDOM$RANDOM | head -c 16)

# Setting absolute path to GNU 'find' for AIX systems
# whos 'find' does not know the '-printf' option.
# Linux Toolbox for AIX or GNU 'find' needed.

opt=/opt/freeware/bin/

# If Linux is used instead AIX, GNU 'find' is already present,
# so comment in below line and comment out the above.

#opt=

echo 'Creating temporary working directories...'
mkdir -p ${wd}.${randir}/duplicates

echo 'Searching for files with same filename AND size in bytes AND MD5 sum...'
${opt}find . -type f -printf '%f\n' | grep -v '.toc' | sort | uniq -d > ${wd}.${randir}/uniq.filenames
${opt}find . -type f -printf '%s\n' | grep -v '.toc' | sort | uniq -d > ${wd}.${randir}/uniq.sizes
${opt}find . -type f -printf '%f.%s\n' | grep -v '.toc' | sort | uniq -d > ${wd}.${randir}/uniq.filenamesandsizes

for filenamesandsizes in $(cat ${wd}.${randir}/uniq.filenamesandsizes)
	do mkdir ${wd}.${randir}/duplicates/${filenamesandsizes}
	done
#endfor

echo 'Calculating MD5 sums of duplicate files. This can take a while...'
for filenames in $(cat ${wd}.${randir}/uniq.filenames)
	do for sizes in $(cat ${wd}.${randir}/uniq.sizes)
		do if [ -d ${wd}.${randir}/duplicates/${filenames}.${sizes} ]
		   then
		   	${opt}find . -type f -name ${filenames} -size ${sizes}c -printf '%p\n' > ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.paths
		   	for paths in $(cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.paths)
				do md5sum=$(md5sum ${paths} | head -c 32)
				   echo ${paths} >> ${wd}.${randir}/duplicates/${filenames}.${sizes}/md5.${filenames}.${sizes}.${md5sum}
				   md5sum=
				done
			#endfor
			cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/md5.${filenames}.${sizes}.* | uniq -d > ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.md5list
			if [ ! -s ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.md5list ]
		   	then
				head -n 1 ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.paths > ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.src
				cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.src ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.paths | uniq -u > ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.links
				srctmp=$(cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.src)
				for links in $(cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.links)
					do rm -f ${links}
					   ln -s ${srctmp} ${links}
					done
				#endfor
				srctmp=
			else
				${opt}find ${wd}.${randir}/duplicates/${filenames}.${sizes}/ -type f -name md5.${filenames}.${sizes}.* -printf '%f\n' > ${wd}.${randir}/md5.tmp
				for md5files in $(cat ${wd}.${randir}/md5.tmp)
					do head -n 1 ${md5files} > ${wd}.${randir}/duplicates/${filenames}.${sizes}/${md5files}.src
					   cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/${md5files}.src ${md5files} | uniq -u > ${wd}.${randir}/duplicates/${filenames}.${sizes}/${md5files}.links
					   srctmp=$(${wd}.${randir}/duplicates/${filenames}.${sizes}/${md5files}.src)
					   for links in $(cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/${md5files}.links)
					   	do rm -f ${links}
					   	   ln ${srctmp} ${links}
					   	done
					   #endfor
					   srctmp=
					done
				#endfor
			fi
		   fi
		done
	done
#endfor

# Cleaning up...
echo 'Cleaning up after finish...'
rm -fr ${wd}.${randir}
echo 'Done.'

exit 0
 
Zuletzt bearbeitet:
die grundidee an sich is ja okay und recht nützlich , aber ....

da müste meiner meinung nach noch ne abfrage routine rein wo man sich entscheiden kann welche von mehreren files das source sein soll.

nicht das grade die source dummerweise gelöscht wird weil diese in einem unerwarteten directory liegt.

kommt natürlich auch immer auf das jeweilige system an ob dies als nützlich erachtet werden könnte.

nur so als idee anstoss :-)
 
ja könnte einer von euch das Script um MD5 Checks erweitern ?

Das wäre ganz nett, ich habe nämlich nen ganzen Arbeitstag damit verbracht
und nur weil es sich wirklich lohnte vom Speicherplatz her. Ich mach zwar hier
Administration, aber das war schon eines der komplizierteren Scripte, die ich
je schreiben musste, man denk immer man weiss aus der Linuxwelt bescheid,
aber dann hackt es irgendwo auf der AIX und dann siehts nemme so toll aus. :o

Ausserdem erfahre ich gerade vom Linux Forum, dass es dafür ein
Programm names "fdupes" gibt, doch leider wollte es auf der AIX nicht
compilieren, daher wäre ich euch um so eine MD5 erweiterung dankbar.
 
bofh schrieb:
die grundidee an sich is ja okay und recht nützlich , aber ....

da müste meiner meinung nach noch ne abfrage routine rein wo man sich entscheiden kann welche von mehreren files das source sein soll.

nicht das grade die source dummerweise gelöscht wird weil diese in einem unerwarteten directory liegt.

kommt natürlich auch immer auf das jeweilige system an ob dies als nützlich erachtet werden könnte.

nur so als idee anstoss :-)

die sourcefiles werden mit diesem script definitv nicht gelöscht,
aber es dürfen auch keie schreibvorgänge von anderen Programmen
ab diesem Verzeichnis+Unterverzeichnisse nebenher laufen.
Allerdings gebe ich dir irgendwo recht, weil das scpt nimmt sich
die quellen "irgendwo" her, nicht wie ich es eigentlich plante
nach dem ersten vorkommen alphabetisch gesehen.

EDIT:

zu Perl script:

Code:
my @allfiles = glob "*";

	for my $file (@allfiles)
	{	
		chomp($md5sum = `md5 $file`);
		$cksum = (split /= /,$md5sum)[1];
		push (@hashedfiles, $file);
		$hash{"$cksum"} = "$file";
  	}
	while (my $key= each %hash) {
		push (@uniqfiles,$hash{$key});
	}
	my $cmp=0;
	for my $element (@hashedfiles){
		for my $qelement (@uniqfiles){
			if ($element == $qelement){
				$cmp++;
			}
		}
			if ($cmp < 1){
	  			`rm -f $element \n`;
                                [B]`ln -s $qelement $element \n`;[/B]
			}
			$cmp=0;
	}

Ich kenn mich mich Perl nicht aus,
aber deute ich das richtig, dass "qelement" fürs jeweilige Quellelement
steht und es durch hinzufügen der fetten Zeile auch immer zu dem
jeweiligen Duplikat(en) passt ?
Ist das die korrekte Perl Syntax ?
Wie gesagt ich hab nur mal nen Counter in Perl geschrieben. :D
 
Zuletzt bearbeitet:
Ja, müsste passen, kannst es ja mal mit testdaten ausprobieren, z.B. so:

Code:
 for i in `seq 1 9`
do
dmesg > $i
done
erzeugt 9 Dateien in denen der dmesg steht, es müsste dann die Datei 1 stehenbleiben und 2..9 als ln angelegt werden.

Das Skript arbeitet dabei alphabetisch, es wird zu jeder Datei eine MD5Summe erzeugt und das ganze als Schlüssel/Wert (md5, Dateiname) in einen Hash geschrieben. Gleiche md5summen werden überschrieben, es bleibt also immer nur eine Datei gleichen Inhalts übrig.
 
hm.. wäre nicht ein hardlink besser als ein symlink?
falls du nämlich dann später mal eine der original-dateien löschst, gehen alle darauf zeigenden symlinks kaputt und die datei ist futsch.

auf bald
oenone
 
oenone schrieb:
hm.. wäre nicht ein hardlink besser als ein symlink?
falls du nämlich dann später mal eine der original-dateien löschst, gehen alle darauf zeigenden symlinks kaputt und die datei ist futsch.

auf bald
oenone

könnte man machen, klar.

leider ist das für meinen einsatzzweck unlogisch, deshalb die symlinks.
 
An dieser Stelle wollte ich nur mal kurz
auf meinen Thread bzgl. File-Duplikate
aufmerksam machen.

also irgendwie wird mir dabei uebel, dateien nur anhand des namens als identisch zu betrachten und dann das rumgewurste mit find, dessen ergebnisse dann in 5 schleifen z.t. nochmal durch find und sogar innere schleifen gejagt werden.

was soll das script denn dem leser verdeutlichen? wie man es moeglichst nicht macht? benutzbar ist das auf jeden fall nicht. du betonst zwar permanent, das es fuer _deinen_ zweck reicht, aber was hat man von einem haesslichen hack, der nur fuer eine situation gut ist? es wird ja wie gesagt nicht mal elegant geloest. ganz davon abgesehen, dass es nicht portabel ist. find auf bsd kennt auch kein -printf.

ich koennte auch ein script veroeffentlichen:
Code:
#!/bin/sh

echo "rc.conf backup 0.1beta"
cp -p /etc/rc.conf /etc/rc.conf.bak
es tut genau, was man will, fuer den fall, dass man /etc/rc.conf nach /etc/rc.conf.bak sichern moechte, aber keiner wuerde etwas von dem script lernen oder es benutzen.

es gibt dinge, die besser nicht an die oeffentlichkeit gelangen und das urspruengliche script ist so ein fall.

einige ueberlegungen dazu, warum so ein dup-checker eigtl ne bloede idee ist:

1) wenn er was taugen soll, dann muesste er beliebige dateien in beliebigen trees finden und zumindest per hash auf gleichheit pruefen.
2a) was ist aber mit den zugriffsrechten? im prinzip werden alle rechte auf die der ersten datei gesetzt
2b) gleiches gilt fuer andere attribute, change date, mod date, access date, flags, etc.
3) was ist mit dateien, die zwar im moment zufaellig identisch sind (und bei denen punkt 2 auch egal ist), die aber rein logisch in keinem zusammenhang stehen, d.h. wo nicht davon ausgegangen werden darf, dass sie auch in zukunft immer identisch bleiben. so ein dup-checker verknuepft die dateien permanent, so dass aenderungen nicht mehr auf eine datei beschraenkt sind.
4) gehen wir davon aus, dass punkt 2 und punkt 3 nicht gelten, d.h. die dateien sind immer identisch und haben immer die gleichen rechte. da stellt sich die frage nach dem ursprung solcher dateien. wenn sie in einem programmpaket "geliefert" werden, waere es cleverer, dort direkt die links setzen zu lassen. was denkbar waere, sind generierte dumps oder sonstige dateien, die man behalten moechte und die zum grossteil identisch sind.

irgendwie "bringts" das alles nicht. vielleicht kannst du deinen fall mal konkret darstellen? im moment hab ich echt nur das gefuehl, dass da im vorfeld schon irgendwas suboptimal laeuft, wenn man zig identische dateien hat und jetzt mit so nem hack hinterheroperiert.
 
Also das Problem kenne ich durchaus auch. Wenn man nicht von vorneherein Ordnung hält, dann hat man schnell viel Unordnung mit doppelten und dreifachen ... Kopien der gleichen Dateien.

In der freeX 2/2005 unter "Tips & Tricks" gibt es zwei Beiträge ("Dateiversionen" und "Doppelte Dateien erkennen"), die vielleicht:

- als Inspirationsquelle dienen können,
- Lösungsansätze bieten können.

Dort wird das auch über MD5 in 'nem kleinen Shell/Perl-Skript erledigt.
 
@tcm

klick mal auf den Link,
lies dir durch was ich schreibe,
dann wirst du merken, dass ich
sehr wohl auf diese "macken"
aufmerksamgemacht habe und
sogar darum gebeten habe mir
zu helfen das script "sicherer"
zu machen.

Trotzdem danke für die unnötige Kritik,
gehts dir jetzt besser ?

EDIT:
habs extra für dich reinkopiert, falls du dich weigern solltest
dich im anderen forum zu registrieren oder so. siehe oben. ;)
 
CAMISOLITE schrieb:
In der freeX 2/2005 unter "Tips & Tricks" gibt es zwei Beiträge ("Dateiversionen" und "Doppelte Dateien erkennen"), die vielleicht: ...

Das Magazin kenn ich nicht und die Ausgabe ist schon alt,
schwer zu bekommen, aber ich arbeite zur zeit sowieso
selbst an einer "MD5" erweiterung, weil niemand hier
die initiative ergreifen will oder kann,
 
@tobiasbeil

über solche leue wie TCM würd ich mich garnicht ärgern ....

elgenate shell scripts die von A-Z durchdacht sind brauchen nunmal zeit und entsprechendes wissen und erfahrung

grade deshalb find ich es gut wenn sich auch jemand traut mal sowas hier reinzuhauen, auch wenn jenseits von perfekt für den ein oder anderen erscheint

bloss mit so einer arogantes flamenden art und weisse zu antworten wie tcm ist unter dem niveau das hier herrschen sollte meiner meinung nach
 
@tobiasbeil:
Nimm TCMs Kritik locker, er hat ja teilweise recht ;-)

Ich find das, was du geschrieben hast nicht schlecht, ist halt noch ein Prototyp.
Aber alle Scripts/Programme sind Prototypen, habe jedenfalls noch keines gesehen, das ohne
irgendein "Problem" in einer Randbedingung war.

Und wem's nicht passt, kann's ja selbst umschreiben.
 
Der find befehl, bzw. dessen parameter -size n[bckw] ist mal total script-ungeeignet.

ich wollte zuerst alle dateien mit gleichem namen finden,
unter diesen dateien mit gleichen namen+filesize,
dann unter diesen dateien mit gleichem namen+filesize+md5summe.

war auch bissle weiter mitm script

hier der momentane stand bis zum "hacken":

Code:
#!/bin/ksh
/opt/freeware/bin/find . -type f -printf '%f\n' | grep -v .toc | sort | uniq -d > duplicates.files
for i in $(cat duplicates.files);do /opt/freeware/bin/find . -type f -iname $i -printf '%s\n' | sort | uniq -d > $i.sizes;done

for i in $(cat duplicates.files);do
	for j in $(cat $i.sizes);do
		if [ -s $i.sizes ] then
			/opt/freeware/bin/find . -type f -iname $i -size [B][I][U]$jc[/U][/I][/B] -printf '%p\n' | sort > $i.paths
		fi;
	done;
done

.....

das problem ist find -size erwartet eine Zahl n, danach den grössentyp,
also ob blöcke (b), bytes (c), kilobytes (k), oder wörter (w=2 bytes)
gesucht werden, der aufruf ist entsprechend find . -size 1024c.

ich habe für die grösse $j als platzhalter, aber geschrieben ists ja $jc weil
ich die grösse bytegenau vergleichen möchte, doch die bash nimmt $jc
als eigenständige varable, die er natürlich nicht findet, weil ja "nur" $j definiert habe.

jetzt sitz ich echt in der klemme.

ich will es nämlich vermeiden, dass der immer jedes (der bei uns 4000+) file(s)
per md5 hashed. das wäre wirklich zuviel des guten von der zeit her...

Hat jemand nen workarround zu bieten ?
 
Ha!

hab ich mal wieder das korn zu früh in die flinte geworfen....


anscheinden kann man das umgehen, indem man einfach geschweifte
klammern um das eigene variablen-wort setzt:

find . -type f -size ${j}c ....

nochmal gut gegangen... das übernehm ich jetzt so für alle variablen.
 
tobiasbeil schrieb:
Das Magazin kenn ich nicht und die Ausgabe ist schon alt,
schwer zu bekommen, [...]

Sooo alt nun auch wieder nicht ! Schon mal bei C&L angefragt ? Dieses Magazin kann man kennen als UNIXer.

tobiasbeil schrieb:
[...], weil niemand hier
die initiative ergreifen will oder kann,

Nun bleib mal geschmeidig ! Lese ich da einen gewissen Unmut heraus ? Das ist hier kein Forum, wo es eine Lösungsgarantie für die eigenen Probleme gibt. Jeder kann selber entscheiden ob und inwieweit er/sie Dir bei Deinem Problem hilft.
 
@oben

danke für www.cul.de die seite kannte ich garnicht und finde das sehr praktisch...
und sorry falls ich bissle deprimiert drauf bin, irgendwo seh ich des net ein,
weil des net meine hauptaufgabe ist scripte zu schreiben, aber wenn ich nicht
genau wüsste es bringt was zum lernen und vor allem für meine nachfolger und
überhaupt für die publikation unserer arbeit später... dann würde ich mich niemals
in so "tiefes" terrain wagen. java und c++ gerne, aber shell scripte... baaääähh :D :D ;)

Peace.

PS: es geht weiter, werde vielleicht heute noch fertig...
 
tobiasbeil schrieb:
[...], doch die bash nimmt $jc
als eigenständige varable, [...]

Nur mal so am Rande und davon abgesehen das Shells mitunter auf andere gelinkt sind (z.B. oft sh -> bash unter Linux):

Du schreibst von der bash, Dein Skript beginnt aber mit:
Code:
#!/bin/ksh

Da solltest Du etwas mehr Sensibilität zeigen. Es ist übrigens durchaus üblich und sinnvoll, Skripte immer unter sh zu schreiben, um die Portierbarkeit zu wahren.
 
tobiasbeil schrieb:
Code:
#!/bin/ksh
/opt/freeware/bin/find . -type f -printf '%f\n' | sort | uniq -d >> duplicates.files
for i in $(cat duplicates.files);do /opt/freeware/bin/find . -type f -name $i | sort >> $i.dpl;done
for i in $(cat duplicates.files);do cat $i.dpl | head -n 1 >> $i.src;done
for i in $(cat duplicates.files);do for j in $(cat $i.src);do grep -v $j $i.dpl >> $i.links;done;done
for i in $(cat *.links);do rm -f $i;done
for i in $(cat duplicates.files);do for l in $(cat $i.links);do for s in $(cat $i.src);do ln -s $s $l;done;done;done
rm -f *.toc
rm -f *.files
rm -f *.links
rm -f *.dpl
rm -f *.src
exit 0

hierzu auch mal noch ein hinweis: es ist nicht sinnvoll 1) arbitraer dateien in dem zielverzeichnis anzulegen und 2) hinterher patterns zu loeschen. leg dir in /tmp ein eindeutiges verzeichnis an, pack da den ganzen temp-kram rein und loesche das dann hinterher. zusaetzlich wuerde es mich stoeren, dass das script die modification time des zielverzeichnisses aendert, selbst wenn keine dateien doppelt sind.

immer nach dem prinzip: veraendere nichts, was nicht mit dem endresultat zu tun hat. optimal waere ein script, welches sich read-only einen ueberblick verschafft, ein bisschen denkt und dann gezielt die aenderungen vornimmt, anstatt erstmal zig dateien anzulegen und hinterher ein superset der tatsaechlich angelegten dateien zu loeschen.

und wenn die kritik nicht genehm ist, dann sollte man vielleicht nichts posten und nach kritik verlangen. andererseits war ja genau das teil der kritik, hmm *head explodes*

was dabei rauskommt, wenn jeder einfach draufloshackt, sieht man ja bei linux *troll* :)

bei lust und gelegenheit setz ich mich vielleicht selber hin und frickel was fuer /bin/sh hin, was das gleiche anders macht.
 
Zuletzt bearbeitet:
tobiasbeil schrieb:

Okay, angenommen/akzeptiert.

Da Du offensichtlich noch recht frisch im Shell-Coden bist (ich bin da auch nicht der Ober-Crack), habe ich eine weitere Literaturempfehlung für Dich:

Shell-Skript Programmierung von Patrick Ditchen, mitp, ISBN 3-8266-0883-6

Ich weiß, daß Dir das jetzt auf die Schnelle nicht weiterhilft, aber ich mutmaße, daß Du auch zukünftig immer wieder mal Skripte erstellen müssen wirst. Das Buch verfolgt einen guten, nachvollziehbaren Ansatz, bietet viele Beispiele und eignet sich auch ausgezeichnet für Möchtegern-Informatiker (bin Ökonom ;) ) wie mich.

Weiterhin noch viel Erfolg mit Deinem Skript. :)
 
@tcm

ich finde es die gängige art und weise mit temporören
dateien zu arbeiten, damit man vorangegeangene ergebnisse
speichern kann um später nicht alles von vorne berechnen zu müssen
in mehrfach ineinander geschachtelten for schleifen...

ich arbeite jetzt im /tmp verzeichenis, anke für den hinweis.

EDIT:

Hier der aktuellestand, vielleicht gibts ja weitere verbesserungsvorschläge.
Ich kann nun alle fileduplikate mit selben namen+filesize.in.bytes identifizieren,
ihren pfad speichern und auf diese "verdächtigten" Duplikate MD5 summen generieren lassen.

hier:

Code:
#!/bin/sh
if [ -d /tmp/rmdupl ]
then
rm -fr /tmp/rmdupl
else
mkdir /tmp/rmdupl
fi
/opt/freeware/bin/find . -type f -printf '%f\n' | grep -v .toc | sort | uniq -d > /tmp/rmdupl/duplicates.files
for i in $(cat /tmp/rmdupl/duplicates.files);do
	/opt/freeware/bin/find . -type f -iname ${i} -printf '%s\n' | sort | uniq -d > /tmp/rmdupl/${i}.sizes
done
for i in $(cat /tmp/rmdupl/duplicates.files);do
	for j in $(cat /tmp/rmdupl/${i}.sizes);do
		if [ -s /tmp/rmdupl/${i}.sizes ]
		then
		/opt/freeware/bin/find . -type f -iname ${i} -size ${j}c -printf '%p\n' | sort > /tmp/rmdupl/${i}.paths
		fi
	done
done
for i in $(cat /tmp/rmdupl/duplicates.files);do
	for j in $(cat /tmp/rmdupl/${i}.paths);do
		md5sum ${j} > ${j}.md5
	done
done


....
...
..
.
 
Zuletzt bearbeitet:
Update so far....


Code:
siehe ersten Beitrag für neueste Version.

"..." symbolisiet dass da noch der eigentlich vergleich hinkommt,
also denkt nicht das ist shcon alles, ich poste es dennoch falls jemandem
ein fehler auffällt, nicht dass ich blind weitermach....
 
Zuletzt bearbeitet:
was mir grad noch einfaellt: kommt das script mit dateien mit leerzeichen im namen zurecht? wie siehts mit grosser anzahl von dateien aus?

ich wuerde die

for i in $(cat ...); do ...; done

durch

cat ... | while read file; do ... "${file}" ...; done

ersetzen. das erschlaegt beide probleme auf einmal. es schadet auch nicht, variablen danach zu benennen, was sie beinhalten, statt immer nur ${i}.
 
Zurück
Oben