[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Zwei Scriptproblem(chen?)



* Andreas Pakulat schrieb am 01.Sep.2003:
> On 01.Sep 2003 - 01:34:40, J. Volkmann wrote:

> > ich habe folgende zwei Probleme, vor denen ich gerade ziemlich ratlos
> > stehe. Der Spaß sollte wenn es geht via Shellscript gelöst werden, da
> > ich das gerne in ein existierendes einbinden würde.
> > 
> > a) Ich habe hier ~5500 Dateien verteilt auf viele Unterordner, bei
> > welchen er mir alle ausspucken soll die die exakt gleiche Größe haben.
> 
> Also wenn ich das richtig verstehe willst du jede Datei mit jeder
> anderen vergleichen? Das wird ziemlich aufwendig, mal davon abgesehen,
> das da ein Shellscript vielleicht nicht unbedingt das richtige ist.
> 
> Das ist aber nicht allzu fix, schätze ich. Obwohl find ja da auch
> ziemlich gut cacht, denke ich. Man könnte das noch optimieren, indem
> man vor dem 2. find überprüft ob der aktuelle Dateiname schon einmal
> ausgegeben wurde. Das könnte dann so aussehen:
> 
> list=""
> find -type f | while read f ; do 
> 	if [[ ! $(echo $list | grep $f) ]] ; then
> 		echo "files with same size as $f:"
> 		list="$(echo -e "$list\n$f")"
> 		l1=$(find -type f -size $(ls -l $f | awk '{print $5}')c -print)
> 		for i in l1 ; do
> 			if [[ !$(echo $list | grep $i ) ]] ; then
> 				echo -e "\t$i"
> 				list=$(echo -e "$i\n$list")
> 			fi
> 		done
> 	fi
> done

Zu kompliziert, jedenfalls wenn man das GNU find verwendet. Die
Klimmzüge mit ls und awk sind hier nicht notwendig. Es reicht ein
einfaches -printf "%b " und es wird die Dateigröße in Blöcken
ausgegeben. Mit %k in kilobytes und mit %s in Bytes.

Allerdings bleibt das Problem, daß man zwei find ineinander
geschachtetlt hat. Und das braucht sehr sehr lange, einfach weil da
sehr viel verglichen werden muß. In etwa Fileanzahl zum Quadrat.

> > b) In dem gleichen Dir soll er mir alle ausspucken welche den gleichen
> > Namen haben. Aber auch unabhängig von der Groß-/Kleinschreibung...
> 
> analog oben aber beim inneren find dann natürlich:
> find -type f -iname $f

Sowohl -printf als auch -iname sind übrigens GNU-find typisch und
funktionieren auf andere find nicht.

Bernd



Reply to: