• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

per Skript aus einer Datei eine Befehlsabfolge erzeugen

superbike

Member
Hallo Leute,
als Skript Anfänger komme ich nicht ganz klar; die Aufgabe lautet:
per ftp und Indexdatei Transfer.txt (mittels Cronjob) gezielt mehrere Dateien und (Unter)Verzeichnisse kopieren. Die (dynamische) Liste steht in der Textdatei Liste.txt und sieht so aus:
Code:
-r--r--r--    1 ff ff        580 Jan  18 11:08 readme
dr--r--r--    1 ff ff        580 Jan  18 11:08 month_11.05
dr--r--r--    1 ff ff        580 Jan  18 11:08 month_12.05
-rw-r--r--    1 ff ff        580 Jan  18 11:08 sys.init
-rw-r--r--    1 ff ff        580 Jan  18 11:08 sysinit.txt
dr--r--r--    1 ff ff        580 Jan  18 11:08 test1
dr--r--r--    1 ff ff        580 Jan  18 11:08 week_51.05
dr--r--r--    1 ff ff        580 Jan  18 11:08 week_52.05
Nun ich will mir die Textdatei Transfer.txt zusammenbauen , welche dann als Batch per ftp laufen soll und die notwendigen cd- und get-Befehle enthalten wird.

Für mich stellen sich folgende Teilaufgaben:
Textdatei in einer while Schleife zeilenweise bearbeiten:
a1) wie mach ich das (open Liste.txt, connect oder so)?
a2) meiner lokale Variable aktuelleZeile eben die gerade aktuelle Filezeile zuweisen
wenn ein Verzeichnis (= d als erstes Attribut), dann schreibe den Befehl "cd name_des_verzeichnis" als neue Zeile nach Transfer.txt.
b1) Wie entscheide ich mit grep über das erste Zeichen?
b2) Wie finde ich den Verzeichnisnamen am Ende der Zeile?
b3) Wie stell ich den String zusammen und hänge den Transfer.txt an?
:oops:
Fragen über Fragen, aber sicher hat mir jemand einen Lösungsansatz.
 

TeXpert

Guru
superbike schrieb:
a1) wie mach ich das (open Liste.txt, connect oder so)?
man bash
hier nach while und nach "Redirecting Input" suchen und verstehen
a2) meiner lokale Variable aktuelleZeile eben die gerade aktuelle Filezeile zuweisen
man bash oder hier im forum suchen, stichworte, while und read
wenn ein Verzeichnis (= d als erstes Attribut), dann schreibe den Befehl "cd name_des_verzeichnis" als neue Zeile nach Transfer.txt.
b1) Wie entscheide ich mit grep über das erste Zeichen?
man bash -> if , substring expansion und die passenden Vergleiche
gabs auch hier im Forum afaik mal eine Übersicht von mit
b2) Wie finde ich den Verzeichnisnamen am Ende der Zeile?
man cut oder man awk
b3) Wie stell ich den String zusammen und hänge den Transfer.txt an?
Zeile normal als Variable aufbauen dann mit echo "foo" > bar rausschreiben, man bash hilft auch hier weiter
 
OP
S

superbike

Member
:shock: aller Anfang ist schwer, danke für die knappen Tipps. Haben mich recht gefordert und bin zu folgendem Resultat gekommen:
Code:
localHome=/backup/PLS
DateiListe="FileListe.txt"
ftpBefehle="BefehlsListe.txt"

# so sieht der Dateiinhalt FileListe.txt etwa aus:
# -r--r--r--    1 ff ff        532 Jan  17 11:39 bitmap
# dr--r--r--    1 ff ff        532 Jan  17 11:39 month_10.06
# dabei ist bitmap eine Datei (-r--r--r--) und month_10.06 ein Verzeichnis (dr--r--r--)

n=1
while read Line; do
#	Muster="dr"								# gesuchter Substring
#	r=`echo  $Line | grep $Muster`		# beachte die Hochkommas <Shift+^>
#	if [ "$r" = "" ]							# beachte Klammer und Hochkommas
	
	if [ "`echo  $Line | grep "dr" `" = "" ]	# Substring "dr" in Line suchen
	then	
		typ="Dateiname "
	else
		typ="Verzeichnis "
	fi 
	echo Zeile $n: '	' $Line		# Tab mit Hochkomma formatieren
														# thx to: http://lansys.ch/shell/strings.htm
	Name1="${Line##* }"					# Mustererkennung mit: ${variable##muster} 
	Name2="${Line//#* /}"					# RegEx ${variable//suchmuster/ersetzung}
	echo '		ist ein '$typ '		' $Name1 '==' $Name2
	echo Zeile $n: $typ 'kopieren:	' $Name1 >> $localHome/$ftpBefehle	# > $Filename: datei schreiben
	n=$((n+1))				# Zähler n inkrementieren
done < $localHome/$DateiListe			# < $Filename: lesen aus dieser Datei durch while read
Resultat: eine Textdatei die so aussieht:
Code:
Zeile 1: Dateiname kopieren:	 bitmap
Zeile 2: Verzeichnis kopieren:	 month_06.05
Zeile 3: Verzeichnis kopieren:	 month_10.06
Zeile 4: Verzeichnis kopieren:	 month_11.06
 

TeXpert

Guru
superbike schrieb:
:shock: aller Anfang ist schwer, danke für die knappen Tipps. Haben mich recht gefordert und bin zu folgendem Resultat gekommen:

cool :) das hat Dir ja richtig was genutzt.... jetzt bin ich auch gerne bereit da nohc mal etwas drüber zu schauen :)

Code:
	if [ "`echo  $Line | grep "dr" `" = "" ]	# Substring "dr" in Line suchen

Problem bei dieser Zeile, was passiert, wenn Du eine Datei mit dem Namen "adressen.txt" hast :) hier matched natürlich das "dr" auch, als Lösung z.B.:

Code:
grep '^dr'
verwenden, damit wird das dr am Zeilenanfang verankert, d.h auf ein
-r--r--r-- 1 ff ff 580 Jan 18 11:08 adressen.txt
matched das nicth
 
OP
S

superbike

Member
hab noch zwei Fragen:
a) wie kann ich eine Schleife vorzeitig verlassen (z.Bsp. Erkennen des ersten gesuchten Eintrages) :?:

Code:
	while read GetCmd; do
		if [ "`echo  $GetCmd | grep '^get' `" != "" ]	# Substring "get" am Anfang der Line suchen
		then						
			rCD="$rLD"						# ListDirectory wird nun zum Kopierdirectory
			return to LABEL		#SO GEHTS NICHT !!??
		fi
		if [ "`echo  $GetCmd | grep '^cd' `" != "" ]	# Substring "cd" am Anfang der Line suchen
		then						
			rLD=$GetCmd						# erster Eintrag wird zum ListDirectory
			return to LABEL		#SO GEHTS NICHT !!??
		fi
	done < $lHome/$ftpBefehle				# < $Filename: auslesen aus Datei durch while read
	LABEL                        #HIER SOLLS WEITERGEHEN

b) wie kann ich testen, ob es ein Verzeichnis schon gibt :?:
Code:
 if [ -f "${Line##*/}" ]; then 	            # -f für File WAS FèR DIRECTORY ???
 

TeXpert

Guru
die Antwort steht natürlich in "man bash"


a/ siehe SHELL BUILTIN COMMANDS
break und coontinue sind die Dinge die Du suchst um den Schleifenablauf zu beeinflussen

b/ siehe CONDITIONAL EXPRESSIONS da sind alle Optionen dabei für Verzeichnisse: if [ -d "foo" ] ; ....
 
Oben