myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

Shell S*****

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 25.05.12, 17:29   #1
3lb4r70
Fidel Castros Sohn
 
Benutzerbild von 3lb4r70
 
Registriert seit: May 2010
Ort: Havanna
Beiträge: 161
Bedankt: 137
3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte
Standard Shell S*****

Ich hab ein kleines Problem. Ich muss für GdI1 diese Aufgabe machen aber komm nicht wirklich weit.

Hier die Aufgabenstellung:

Schreiben Sie ein Shellskript convert.bash, das für ein beliebiges Verzeichnis alle dort enthaltenen Dateien mit einer
als Parameter übergebenen Endung (z.B. .doc) in das aktuelle Verzeichnis kopiert und die Endung austauscht gegen
eine als weiterer Parameter übergebenen Endung (z.B. .txt).

Alles was ich bis jetzt hinbekommen hab, war das eine bestimmte Datei zwar kopiert wurde und umbenannt aber nicht richtig umbenannt wurde.

hier das S*****

#!/bin/sh
for i in $1/*.txt
do cp "$i" *.TXT
done

für .txt und .TXT müssen Parameter eingesetzt werden

es sollte dann so geschrieben werden: ./convert.bash (verzeichnis) (dateiendung1) (dateiendung2)

Hilfe und erklärungen wie das gemacht wurde nehm ich gerne an

MfG
__________________
Satzzeichen sind keine Rudeltiere
3lb4r70 ist offline   Mit Zitat antworten
Ungelesen 26.05.12, 01:11   #2
slahn
Erfahrenes Mitglied
 
Benutzerbild von slahn
 
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
slahn ist noch neu hier! | 0 Respekt Punkte
Standard

der Stern[*] wird immer durch eine Zeichenkette ersetzt, der übereinstimmt. *.txt liefert dir also korrekt einen String mit allen Datein mit dem Namen IRGENDWAS.txt und legt pro durchgang einen Dateinamen in $i ab. Jedoch wird der Inhalt von * nicht gespeichert (und selbst wenn, würde das ganze aus einem String aller Datein bestehen, die mit .txt enden und nicht nur der einen Datei von dem Durchgang), somit wird dann bei deinem Umbennenungsversuch bei *.TXT, nicht der Präfix von *.txt zurückgegeben, sondern ein String mit allen Datein, die IRGENDWAS.TXT heißen. Somit versuchst du so ca. soetwas: "cp DATEI.txt datei1.TXT datei2.TXT datei3.TXT dateiN.TXT . cp hat aber die Angewohnheit, bei mehr als 2 Parametern, alle Datein in das Verzeichnis (was im letzten Parameter angegeben ist) zu kopieren, was ja nicht dein Ziel ist .

Um den Suffix zu verändern, würde ich dir sed empfehlen, was auf jedem Unix dabei sein sollte. Dazu musst du nur die vorletzte Zeile anpassen.

hier die Lösung, wenn du zu "faul" bist selbst zu tüfteln...
__________________
"[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]" (Klopfers Vater)
slahn ist offline   Mit Zitat antworten
Ungelesen 26.05.12, 01:20   #3
josum
Erfahrener Newbie
 
Benutzerbild von josum
 
Registriert seit: Nov 2011
Beiträge: 98
Bedankt: 40
josum ist noch neu hier! | 0 Respekt Punkte
Standard

Also die übergebenen Paramter liest du ganz einfach mit $1 $2 $3 aus. Aber das hast du ja sicher auch schon bemerkt, sonst hättest du ja nicht in der for schleife $1 geschrieben

Das skript sieht bei mir letztendlich so aus:

Erklärung zu Zeile 3: mit dem Statement {i%$2} wird dem interpreter quasi nur gesagt das er aus der Zeichenkette $i von rechts nach links das erste aufkommen der zeichenkette $2 löschen soll. Durch die $3 dahinter soll er dann die andere Dateiendung dranhängen. Der Punkt ist ja noch vorhanden, da man ja bei der Parameterübergabe, laut deinem Beispiel, nur die Endung ohne Punkt übergibt.

Viele Grüße
Josum

EDIT: Oh, da war wohl einer schneller... nichts für ungut
josum ist offline   Mit Zitat antworten
Ungelesen 26.05.12, 12:33   #4
slahn
Erfahrenes Mitglied
 
Benutzerbild von slahn
 
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
slahn ist noch neu hier! | 0 Respekt Punkte
Standard

Die Lösung von josum wird aber nur von der bash und der csh unterstützt (nur wichtig, wenn es quasi überall lauffähig sein soll) aber sonst ist es halt übersichtlicher als sed.

Eine weiterer Ansatz wäre die Verwendung von "basename". Damit kann man auch einen Suffix entfernen, aber leider auch immer den Pfad davor (dafür gibt es dann aber dirname; beides gehört zu posix und sollte daher auch bei jeder Linux Distribution dabei sein).

Aber wie heißt es so schön ... Viele Wege führen nach Rom ...
__________________
"[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]" (Klopfers Vater)
slahn ist offline   Mit Zitat antworten
Ungelesen 26.05.12, 13:05   #5
3lb4r70
Fidel Castros Sohn
 
Benutzerbild von 3lb4r70
 
Registriert seit: May 2010
Ort: Havanna
Beiträge: 161
Bedankt: 137
3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte
Standard

Ich hab beide Sachen ausprobiert.
Bei der von Josum hat er die Datei kopiert und auch die Dateiendung verändert wie gewollt, aber leider alles im ausgewählten Ordner.
Was mir auch aufgefallen ist,dass nur eine Datei verändert wird. Es müssen aber alle Datein mit der gleichen Endung verändert werden

Nachdem ich das in vi eingetippt hab,hab ich anschließend chmod u+x gemacht
dann ./convert.bash(so heißt die datei) Dokumente(das beliebige Verzeichnis) txt doc

er hat halt die Datei nicht in ./ gelegt sondern in Dokumente

Bei der Lösung von slahn hab ich wie erklärt die Sachen ausgetauscht,


aber dann kommt immer


Hoffe ihr könnt mir da weiterhelfen, also das erste ist gut es fehlt nur noch das er es in den aktuellen Ordner kopiert/verändert

MfG
__________________
Satzzeichen sind keine Rudeltiere
3lb4r70 ist offline   Mit Zitat antworten
Ungelesen 26.05.12, 13:52   #6
slahn
Erfahrenes Mitglied
 
Benutzerbild von slahn
 
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
slahn ist noch neu hier! | 0 Respekt Punkte
Standard

Du hast bei meinem Code die single quotes vergessen. Damit sed mit Umgebungsvariablen arbeiten kann, muss man die single quotes schließen, da ja sed sonst $var1 bekommt und nicht den Inhalt. Zudem war $var1 nur ein Beispiel ...

Aber hier die komplette Lösung, die auch in der sh laufen sollte (getestet mit der dash):
Code:
#!/bin/sh
for source_file in $1/*.$2
do
   cp $source_file "`basename $source_file ".$2"`.$3"
done
exit 0
Parameter 1 ($1) muss den Pfad enthalten; Parameter 2 ($2) den gesuchten Suffix (ohne Punkt); Parameter 3 ($3) den neuen Suffix (ohne Punkt);;

Alle die Dateien werden in das aktuelle Verzeichnis kopiert.

[Hab mich jetzt für basename entschieden, da du es ja eh ins aktuelle Verzeichnis kopieren willst und man mit sed noch selbst das Verzeichnis entfernen müsste (sed ist zwar sehr flexibel und kann mit Texten so gut wie alles machen, aber wenn es schon eine fertige Lösung gibt, muss man ja das Rad nicht neu erfinden ...)]
__________________
"[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]" (Klopfers Vater)
slahn ist offline   Mit Zitat antworten
Ungelesen 26.05.12, 14:22   #7
3lb4r70
Fidel Castros Sohn
 
Benutzerbild von 3lb4r70
 
Registriert seit: May 2010
Ort: Havanna
Beiträge: 161
Bedankt: 137
3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte3lb4r70 leckt gerne myGully Deckel in der Kanalisation! | 14321814 Respekt Punkte
Standard

Super, hab es grade getestet. Es funktioniert alles. Danke euch beiden für die schnelle Hilfe und auch die Erklärungen dafür.
Das hat mir sehr geholfen.

MfG
__________________
Satzzeichen sind keine Rudeltiere
3lb4r70 ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:21 Uhr.


Sitemap

().