Hallo Liste, ich versuche schon seit zwei Stunden "find" zu bezwingen, kriegs aber irgendwie nicht hin. Geplant ist folgendes : Es existiert ein Verzeichnis mit mehreren Dateien. Jede Datei mit einer bestimmten Endung (zb html) soll mit sed "behandelt" werden. sed soll eine Textersetzung machen und die Ausgabe auf eine temporäre Datei umleiten. Nachdem sed fertig ist, wird die ursprüngliche Datei gelöscht, die temporäre Datei erhält den Namen der ursprünglichen Datei. Die sed-Sequenz im Script sähe folgendermaßen aus : ---script---- #!/bin/sh txt=s/$1/$2/g sed "$txt" $datei > $datei.tmp rm $datei mv $datei.tmp datei ---script----- Die nicht funktionierende find-Sequenz : find . -name `$3` -exec <- hier soll die obige Sequenz ausgeführt werden Aufruf wäre dann zb : ./script text1 text2 "*.html" Kann mir da jemand auf die Sprünge helfen ? mfg Harry
Moin,
* Harry Rüter
Jede Datei mit einer bestimmten Endung (zb html) soll mit sed "behandelt" werden. find verzeichnis -name '*.html' -exec sed sedkrams {} \;
sed soll eine Textersetzung machen und die Ausgabe auf eine temporäre Datei umleiten.
Nachdem sed fertig ist, wird die ursprüngliche Datei gelöscht, die temporäre Datei erhält den Namen der ursprünglichen Datei. Ist das wirklich nötig? Kann sed(1) nicht die Datei direkt ändern?
Thorsten -- Liberty is not the means to a higher political end. It is itself the highest political end. - Lord Acton
Hi Thorsten, Thorsten Haude wrote:
Moin,
* Harry Rüter
[02-02-17 17:13]: Jede Datei mit einer bestimmten Endung (zb html) soll mit sed "behandelt" werden. find verzeichnis -name '*.html' -exec sed sedkrams {} \;
Ja, aber der Parameter nach dem -name soll ja variabel als Kommandozeilenparameter übergeben werden, deshalb wird er ja beim Aufruf des scripts mit "*.xyz" gequotet übergeben. Das ist das erste Problem: wie bekomme ich *.xyz an die Stelle hinter -name ?
sed soll eine Textersetzung machen und die Ausgabe auf eine temporäre Datei umleiten.
Nachdem sed fertig ist, wird die ursprüngliche Datei gelöscht, die temporäre Datei erhält den Namen der ursprünglichen Datei. Ist das wirklich nötig? Kann sed(1) nicht die Datei direkt ändern?
Meines Wissens schreibt sed auf die Standardausgabe, sonst würde ichs nicht so probieren. Kann ich denn nach dem exec überhaupt mehrere Befehle sequentiell ausführen ? Wie sieht denn die Ersetzung des gefundenen Dateinamens überhaupt aus ? Ist das etwa dieses {} ? Mein Gulbins/Obermayr und die man-Pages helfen mir irgendwie nicht weiter, ich steh' auf'm Schlauch ...
Thorsten
mfg Harry
Moin,
* Harry Rüter
Thorsten Haude wrote:
* Harry Rüter
[02-02-17 17:13]: Jede Datei mit einer bestimmten Endung (zb html) soll mit sed "behandelt" werden. find verzeichnis -name '*.html' -exec sed sedkrams {} \; Ja, aber der Parameter nach dem -name soll ja variabel als Kommandozeilenparameter übergeben werden, deshalb wird er ja beim Aufruf des scripts mit "*.xyz" gequotet übergeben.
Das ist das erste Problem: wie bekomme ich *.xyz an die Stelle hinter -name ? Ach ja, habe ich übersehen. Tja, dann mußt Du dem Skript eben einen Parameter übergeben: find verzeichnis -name '$1' -exec sed sedkrams {} \; Vielleicht auch "$1" oder \'$1\'. Spiel mal ein wenig 'rum, um die richtige Kombination zu finden.
sed soll eine Textersetzung machen und die Ausgabe auf eine temporäre Datei umleiten.
Nachdem sed fertig ist, wird die ursprüngliche Datei gelöscht, die temporäre Datei erhält den Namen der ursprünglichen Datei. Ist das wirklich nötig? Kann sed(1) nicht die Datei direkt ändern? Meines Wissens schreibt sed auf die Standardausgabe, sonst würde ichs nicht so probieren. Kann sein. Ich würd's überhaupt mit Perl machen.
Kann ich denn nach dem exec überhaupt mehrere Befehle sequentiell ausführen ? Man müßte mehrere -execs hintereinander benutzen können. Die sind aber normalerweise und-verknüpft.
Wie sieht denn die Ersetzung des gefundenen Dateinamens überhaupt aus ? Ist das etwa dieses {} ? Jepp.
Thorsten -- Wasn't the storming of the Bastille an act of terrorism? Probably. Now it's a holiday. - umarsyed
Hi, On Sunday, February 17, 2002 at 17:13:54, Harry Rüter wrote:
ich versuche schon seit zwei Stunden "find" zu bezwingen, kriegs aber irgendwie nicht hin.
Geplant ist folgendes :
Es existiert ein Verzeichnis mit mehreren Dateien.
Jede Datei mit einer bestimmten Endung (zb html) soll mit sed "behandelt" werden.
sed soll eine Textersetzung machen und die Ausgabe auf eine temporäre Datei umleiten.
Nachdem sed fertig ist, wird die ursprüngliche Datei gelöscht, die temporäre Datei erhält den Namen der ursprünglichen Datei.
Die sed-Sequenz im Script sähe folgendermaßen aus :
---script----
#!/bin/sh
txt=s/$1/$2/g
sed "$txt" $datei > $datei.tmp rm $datei mv $datei.tmp datei
---script-----
Die nicht funktionierende find-Sequenz :
find . -name `$3` -exec <- hier soll die obige Sequenz ausgeführt werden
Aufruf wäre dann zb :
./script text1 text2 "*.html"
warum find? #!/bin/sh for i in $3; do sed s/$1/$2/g w $i > $i.tmp rm $i mv $i.tmp $i done Henne -- Hendrik Vogelsang aka Henne mailto: hvogel@hennevogel.de If you could be either God's worst enemy or nothing, which would you choose? # fightclub sigs made with fortune
Hi Henne, Henne Vogelsang wrote:
Hi,
On Sunday, February 17, 2002 at 17:13:54, Harry Rüter wrote:
ich versuche schon seit zwei Stunden "find" zu bezwingen, kriegs aber irgendwie nicht hin.
Geplant ist folgendes :
Es existiert ein Verzeichnis mit mehreren Dateien.
Jede Datei mit einer bestimmten Endung (zb html) soll mit sed "behandelt" werden.
sed soll eine Textersetzung machen und die Ausgabe auf eine temporäre Datei umleiten.
Nachdem sed fertig ist, wird die ursprüngliche Datei gelöscht, die temporäre Datei erhält den Namen der ursprünglichen Datei.
Die sed-Sequenz im Script sähe folgendermaßen aus :
---script----
#!/bin/sh
txt=s/$1/$2/g
sed "$txt" $datei > $datei.tmp rm $datei mv $datei.tmp datei
---script-----
Die nicht funktionierende find-Sequenz :
find . -name `$3` -exec <- hier soll die obige Sequenz ausgeführt werden
Aufruf wäre dann zb :
./script text1 text2 "*.html"
warum find?
Das funzt nur, wenn die Dateien keine Leerzeichen enthalten, tun sie aber (schlechtes deutsch,naja ich laß es mir mal durchgehen :o) ) Hatte ich vergessen zu erwähnen, sonst wäre ich sicher ohne das find weitergekommen.
#!/bin/sh
for i in $3; do sed s/$1/$2/g w $i > $i.tmp rm $i mv $i.tmp $i done
Henne
mfg Harry
Hi, On Sunday, February 17, 2002 at 18:16:08, Harry Rüter wrote:
Henne Vogelsang wrote:
On Sunday, February 17, 2002 at 17:13:54, Harry Rüter wrote:
---script----
#!/bin/sh
txt=s/$1/$2/g
sed "$txt" $datei > $datei.tmp rm $datei mv $datei.tmp datei
---script-----
Die nicht funktionierende find-Sequenz :
find . -name `$3` -exec <- hier soll die obige Sequenz ausgeführt werden
Aufruf wäre dann zb :
./script text1 text2 "*.html"
warum find?
Das funzt nur, wenn die Dateien keine Leerzeichen enthalten, tun sie aber (schlechtes deutsch,naja ich laß es mir mal durchgehen :o) )
Hatte ich vergessen zu erwähnen, sonst wäre ich sicher ohne das find weitergekommen.
#!/bin/bash for file in * do if ( echo $file | grep "\.$3$" ) &>/dev/null then sed s/$1/$2/g "$file" fi done Mit dem rm würde ich mir nochmal stark überlegen. Ich find zwar den schalter w in der sed man page aber irgendwie geht der nicht. Henne -- Hendrik Vogelsang aka Henne mailto: hvogel@hennevogel.de If you could be either God's worst enemy or nothing, which would you choose? # fightclub sigs made with fortune
Hi, Henne Vogelsang wrote:
Hi,
On Sunday, February 17, 2002 at 18:16:08, Harry Rüter wrote:
Henne Vogelsang wrote:
On Sunday, February 17, 2002 at 17:13:54, Harry Rüter wrote:
---script----
#!/bin/sh
txt=s/$1/$2/g
sed "$txt" $datei > $datei.tmp rm $datei mv $datei.tmp datei
---script-----
Die nicht funktionierende find-Sequenz :
find . -name `$3` -exec <- hier soll die obige Sequenz ausgeführt werden
Aufruf wäre dann zb :
./script text1 text2 "*.html"
warum find?
Das funzt nur, wenn die Dateien keine Leerzeichen enthalten, tun sie aber (schlechtes deutsch,naja ich laß es mir mal durchgehen :o) )
Hatte ich vergessen zu erwähnen, sonst wäre ich sicher ohne das find weitergekommen.
#!/bin/bash for file in * do if ( echo $file | grep "\.$3$" ) &>/dev/null then sed s/$1/$2/g "$file" fi done
Mit dem rm würde ich mir nochmal stark überlegen. Ich find zwar den schalter w in der sed man page aber irgendwie geht der nicht.
Henne
Also, ich habs ohne find hingekriegt: ----------script-------------------- #!/bin/sh for file in $3 do echo -n $file sed s/$1/$2/g "$file" > "$file".tmp rm "$file" mv "$file.tmp" "$file" echo " done." done ----------script-------------------- Aufruf mit: ./script text1 text2 "Dateimaske" Würde mich aber trotzdem noch interessieren, wie es mit find gegangen wäre. Der Knackpunkt ist dem find den Parameter "*.xyz" unterzuschieben. Ich hab's jetzt in tausend Varianten probiert und es hat bisher nicht funktioniert. Also es sollte dann folgendes dastehen: find . -name '*.xyz' -exec ... Hier muß dann was mit $3 stehen ^^^ Aufruf von der shell wie oben: ./script text1 text2 "Dateimaske" Dann könnte man das evtl. auch rekursiv in den Unterverzeichnissen machen, als Workaround mach ich's eben "händisch" :-( mfg Harry
* Harry Rüter schrieb am 17.Feb.2002:
----------script--------------------
#!/bin/sh
for file in $3
Ich dachte, in Deiner $3 steht die Endung. Wieso denn for file in $3? Da kann was nicht stimmen. So wie es da steht wird $file auf die Endung gesetzt und das war es dann.
do echo -n $file sed s/$1/$2/g "$file" > "$file".tmp rm "$file"
Warum ein rm, wenn Du nachfolgend ein mv auf eben dieses File machst? Das rm ist überflüssig bis schädlich, falls der mv nicht klappt.
mv "$file.tmp" "$file" echo " done." done ----------script--------------------
Aufruf mit:
./script text1 text2 "Dateimaske"
Würde mich aber trotzdem noch interessieren, wie es mit find gegangen wäre.
Der Knackpunkt ist dem find den Parameter "*.xyz" unterzuschieben. Ich hab's jetzt in tausend Varianten probiert und es hat bisher nicht funktioniert.
Also es sollte dann folgendes dastehen:
find . -name '*.xyz' -exec ... Hier muß dann was mit $3 stehen ^^^
find . -name "$3" funktioniert nicht? Achso, der * Dann vorher noch ein name = "'*'$3" und dann find . -name "$name" Habe ich jetzt aber auch nicht ausprobiert. Vielleicht funktioniert auch find . -name "*$3" Bernd -- Welches Buch ist zu empfehlen? Schon mal bei SuSE vorbeigesehen? http://www.suse.de/de/products/books/index.html oder die Empfehlungen der SuSE-Entwickler auf dem eigenen Rechner? file:///usr/share/doc/sdb/de/html/literatur.html |Zufallssignatur 5
Bernd Brodesser wrote:
* Harry Rüter schrieb am 17.Feb.2002:
Der Knackpunkt ist dem find den Parameter "*.xyz" unterzuschieben. Ich hab's jetzt in tausend Varianten probiert und es hat bisher nicht funktioniert.
Also es sollte dann folgendes dastehen:
find . -name '*.xyz' -exec ... Hier muß dann was mit $3 stehen ^^^
find . -name "$3" funktioniert nicht? Achso, der * Dann vorher noch ein name = "'*'$3" und dann find . -name "$name"
Habe ich jetzt aber auch nicht ausprobiert. Vielleicht funktioniert auch find . -name "*$3"
Wäre das nicht vielleicht ein Anwendungsfall für den Befehl "eval"? Dann läuft die Bash _2x_ über den Ausdruck... Ralph
Hallo, On Mon, 18 Feb 2002, Ralph Müller wrote:
Bernd Brodesser wrote:
* Harry Rüter schrieb am 17.Feb.2002:
Der Knackpunkt ist dem find den Parameter "*.xyz" unterzuschieben. Ich hab's jetzt in tausend Varianten probiert und es hat bisher nicht funktioniert.
Also es sollte dann folgendes dastehen:
find . -name '*.xyz' -exec ... Hier muß dann was mit $3 stehen ^^^
find . -name "$3" funktioniert nicht? Achso, der * Dann vorher noch ein name = "'*'$3" und dann find . -name "$name"
Habe ich jetzt aber auch nicht ausprobiert. Vielleicht funktioniert auch find . -name "*$3"
Wäre das nicht vielleicht ein Anwendungsfall für den Befehl "eval"? Dann läuft die Bash _2x_ über den Ausdruck...
Also hier geht's (bash 2.04). ,----[ /tmp/test/find.sh ] | #! /bin/bash | # USAGE: find.sh "PFAD" "PATTERN" "REPLACEMENT" "FILEPATTERN" | # all arguments MUST be quoted! | sedexpr="s/$2/$3/g" | find "$1" -name "$4" -exec /tmp/test/sed.sh "$sedexpr" {} \; `---- ,----[ /tmp/test/sed.sh ] | #!/bin/sh | expr="$1"; shift; | OLDIFS="$IFS" | IFS=" | " | for file in $@ | do | cp -i "${file}" "${file}.bak" | sed "$expr" < "${file}.bak" > "${file}" \ | || mv "${file}.bak" "${file}" | done | IFS="$OLDIFS" `---- z.B: /tmp/test/find.sh /tmp/test/ "#inlcude" "#include" "*.c" Obiges bedingt Dateinamen ohne Zeilenumbruch ('\n') im Namen, Leerzeichen sind ok (man achte auf das durchaengige quoten). -dnh -- Sex in tv programs, and the "monkey see, monkey do" principle. In other words if on-screen violence switched from exotic machines guns to everyday items found around the household, America's average IQ would rise. -- Chris Hacking in asr. about luser reproduction
Moin,
* Harry Rüter
find . -name `$3` -exec <- hier soll die obige Sequenz ausgeführt werden Habe ich gerade erst gesehen: Benutzt Du wirklich Backticks? Versuch's mit einfachen Anführungszeichen. Vielleicht hilft ein Blick in 'man $SHELL', es gibt da verschiedene Variablen, die damit zu tun haben ($@, $*).
Thorsten -- You're not supposed to be so blind with patriotism that you can't face reality. Wrong is wrong, no matter who does it or who says it. - Malcolm X
* Thorsten Haude schrieb am 17.Feb.2002:
* Harry Rüter
[02-02-17 17:13]:
find . -name `$3` -exec <- hier soll die obige Sequenz ausgeführt werden Habe ich gerade erst gesehen: Benutzt Du wirklich Backticks? Versuch's mit einfachen Anführungszeichen.
Backticks sind auf jeden Fall verkehrt. Wenn Backticks genommen werden, dann wird versucht $3 auszuführen.
Vielleicht hilft ein Blick in 'man $SHELL', es gibt da verschiedene Variablen, die damit zu tun haben ($@, $*).
Nee, $@ und $* stehen in diesem Fall für $1 $2 $3 das ist ja wohl nicht gemeint. Bernd -- Umsteiger von Microsoft Windows xx? Hast Du schon file://usr/doc/howto/de/DE-DOS-nach-Linux-HOWTO.txt gelesen? Auch file://usr/doc/Books/Linuxhandbuch.dvi ist zu empfehlen. |Zufallssignatur 1
participants (6)
-
B.Brodesser@t-online.de
-
David Haller
-
Harry Rüter
-
Henne Vogelsang
-
Ralph Müller
-
Thorsten Haude