Mit "find"-Befehl Dateien finden und in deren Verzeichnis Befehle ausführen

ThommyDD

Lt. Commander
Registriert
Sep. 2011
Beiträge
1.050
Hallo zusammen,

ich möchte gern in einem Shell-Skript mit dem Befehl "find" Textdateien in einem Startverzeichnis und dessen Unterverzeichnissen finden und in diesen Dateien eine bestimmte Textstelle ändern.

Problem: In der Umgebung, in der ich arbeite, kennt der "find"-Befehl den Parameter "-execdir" nicht, sondern nur "-exec", und der "sed"-Befehl zum Ändern des Dateiinhalts kennt den Parameter "-i" nicht!

Damit bin ich gezwungen, die Dateien nach ihrer Änderung unter neuem Namen abzuspeichern, die Originaldatei zu löschen und die neue Datei umzubenennen. Dazu muss ich aber auf das jeweilige Verzeichnis zugreifen können, sonst passiert das alles im Startverzeichnis. Ich hatte vor, das mit einer "while read"-Schleife zu machen, scheitere aber an der Übergabe des jeweiligen Dateipfades. Wie kann ich das denn bewerkstelligen?

Folgende Beispielsituation:
Code:
Startverzeichnis
  |->Verzeichnis1
  |     |->test1.txt
  |->Verzeichnis2
  |     |->test2.txt
  |->Verzeichnis3
        |->test3.txt

Finden der Dateien:
Code:
find . -name "*.txt"

Und für alle Treffer soll folgendes ausgeführt werden:
Code:
sed -e 's/Ausdruck_alt/Ausdruck_neu/g' < Dateiname1.txt > Dateiname1_neu.txt
rm Dateiname1.txt
mv Dateiname1_neu.txt Dateiname1.txt

Für Ideen und Lösungsvorschläge wäre ich Euch sehr dankbar. :-)

Grüße,
Thomas
Ergänzung ()

Eine Nacht drüber geschlafen, habe ich es nun doch selbst hinbekommen:

Code:
Dateien=($(find . -name "*.txt"))
for i in ${Dateien[@]}
do
 Verzeichnis=$(dirname $i) 
 sed -e 's/Ausdruck_alt/Ausdruck_neu/g' < $i > $Verzeichnis/temp.txt
 rm $i
 mv $Verzeichnis/temp.txt $i
done

Vielleicht hilft es ja auch jemand anderem weiter. :)

Grüße,
Thomas
 
Hi, und sorry, dass ich den Thread erst jetzt lese, aber folgender Einzeiler:
Code:
find . -name '*.txt' -exec sed -ie 's/Ausdruck_alt/Ausdruck_neu/g' {} \;
sollte genau das machen, was du willst.
 
Danke, aber warum ich das nicht mache, steht oben: In der von mir verwendeten Umgebung kann "sed" kein "-i".
 
Zurück
Oben