ordner auf änderungen überwachen

T

theking2k

Grünschnabel
verzeichniss auf änderungen überwachen

moin

so mein erster post und gleich eine frage ^^

shell: bash
OS: kubuntu
kernel: 2.6.15-28-386

ok zu meiner frage
ich will ein script schreiben das permanent alle daten in einem bestimmten verzeichniss überprüft und gegebenenfalls verarbeitet. das einzigste was mir einfällt ist es in eine endlosschleife (while [ 1 ]) zu packen was natürlich grosser schwachsinn wäre. deswegen wollte ich hier mal fragen ob es eine bessere lösung gibt. ziel der ganzen geschichte ist fertige torrent in einen anderen ordner zu kopieren. anbei poste ich mal meinen versuch mit einer endlos schleife (nicht lachen ist so ziemlich mein erstes bash script ^^)


Code:
#!/bin/bash
#---------------------------------------------------------------------------------
#---------------------------------------------------------------------------------
#   mi torrent script    -    my first bash script
#---------------------------------------------------------------------------------
#---------------------------------------------------------------------------------

#logging optionen
enablelog=1
logfile="/var/log/torrent"
#logentry (vars: $tname $tfolder $tinfohash $tsize $torr $announce)
logentry="`date +%c` torrent download $torr completed"

#torrent settings
minport=33333
maxport=44444
upspeed=0
downspeed=0

#other settings
screenname="torrent"
keeptorrents=1
visible=1

#folders
donefolder="/home/theking2k/scripts/loria.core/torrent_test/competed"
junkfolder="/home/theking2k/scripts/loria.core/torrent_test/completed.torrent"
torrfolder="/home/theking2k/scripts/loria.core/torrent_test/working"

#starting bittorrent
#screen -t $screenname btlaunchmanycurses.bittornado "$torrfolder" --saveas_style 3 --upnp_nat_access 0 --minport $minport --maxport $maxport --max_upload_rate $upspeed --max_download_rate $downspeed --auto_flush 5

#function if the torrent is finished
finished () 
{
	mv "$1" "$donefolder"
	if [ $keeptorrents = 1 ]; then
		mv "$2" "$junkfolder"
	else
		rm "$2"
	fi
}

strlen ()
{
	for i in "$@"; do
	echo ${#i}
	done
}


#loop to test files
while [ 1 ]; do
	for file in $torrfolder/*.torrent; do
		if [ $file = "$torrfolder/*.torrent" ]; then
			echo "no files found"
		else
			# setup names
			path=$(echo "$file" | cut -c 1-$(( $(strlen "$file") - 8 )))

			# get torrent infos
			info=$(btshowmetainfo "$file")
			torr="`echo "$info" | grep "metainfo file.:" | sed s/^[^:]*:// | sed s/^" "// | sed s/" "[^$]*//`"
			tannounce="`echo "$info" |grep "announce" | sed s/^[^:]*:// | sed s/^" "// | sed s/" "[^$]*//`"
			tinfohash="`echo "$info" | grep "info hash.." | sed s/^[^:]*:// | sed s/^" "// | sed s/" "[^$]*//`"
			tdirname="`echo "$info" | grep "directory name:" | sed s/^[^:]*:// | sed s/^" "// | sed s/" "[^$]*//`"
			tsize="`echo "$info" | grep "size" | sed s/^[^:]*:// | sed s/^" "// | sed s/" "[^$]*//`"
			tfilename="`echo "$info" | grep "file name" | sed s/^[^:]*:// | sed s/^" "// | sed s/" "[^$]*//`"

			#get download current size if folder exsist
			if [ -d $path ]; then
				tester=$(( $(du -sb "$path" | sed s/"	"[^$]*//) - 4096 ))
				if [ $tester -ge $tsize ];then
					if [ $verbose = 1 ]; then
						echo "----    torrent is ready    ----"
					fi
					finished $path $file
					if [ $visible=1 ];then 
						echo "$logentry" >> "$logfile" 
					fi
				else
					if [ $visible = 1 ]; then
						echo "----    torrent not ready    ----"
					fi
				fi
			fi

			#show info if visible = 1
			if [ $visible = 1 ]; then
				echo -e "----    $torr     ----"
				echo -e "info hash:\t$tinfohash"
				echo -e "tracker:\t$tannounce"
				echo -e "savepath:\t$path"
				echo -e "size:\t\t$tsize"
				echo -e "curr size:\t$tester"
				echo
				echo
			fi
		fi
  	done
done

hoffe das macht die frage leichter verständlich.

PS. ordner wurde durch verzeichniss ersetzt - willkommen in eurer welt :D

mfg theking2k
 
Zuletzt bearbeitet:
Hallo
Sorry, ein wenig dünn, was du da als Ziel angibst.
Was willst du denn mit den Dateien in diesn Verzeichnissen (Ordner ist ein komischer Begriff aus einer anderen Welt *g*) machen, und nach welchen Kriterien soll etwas passieren?

Analysiere erstmal deine Zielstellung richtig, dann ergibt sich auch die Lösung.

Das ist meist der richtige Schritt zur Lösung.
Klares Erkennen der Zielstellung.

Sorry, so kann ich wenig helfen.

Gruß Wolfgang
PS Nicht abschrecken lassen, aber das ist wirklich wichtig.
 
Wuerde es nicht einfach ausreichen, alle paar Minuten in dem Verzeichnis nach nachzusehen? Oder das Script von cron-maessig ausfuehren zu lassen? :think:
 
damm

es würde natürlch reichen das script nur alle Minuten (Stunden) auszuführen, mir war nur nicht klar das es cron gibt :headup: .


thx nille
 
Zuletzt bearbeitet:
Hi,
ohne dein Script ausführlich zu lesen...

Variante 1:
Schreibe ein sleep 60 in die while-Schleife

Variante 2:
nutze das neue Kernelfeature (ab 2.6.13) inotify. Damit kannst Du Programme Signale schicken, wenn sich etwas in einem Teil des Filesystems geändert hat.

CU
Tastenklopfer
 

Ähnliche Themen

Switche abfragen über Script

NAS-Drive Mount in Bash-Script über crontab

script sshpass

Verschlüsseltes Backup-Script mit rsync

Grafische Anzeige der Temperatur

Zurück
Oben