find: Dateien manipulieren und ersetzen

  1. sheep

    sheep Thread StarterMacUser Mitglied

    Mitglied seit:
    21.03.2005
    Beiträge:
    1.223
    Zustimmungen:
    24
    Hallo allerseits

    Ich möchte gerne mit find bestimmte Dateien (sehr viele) in einem Verzeichnis finden und von diesen jeweils die ersten paar (konkret: 43) Text-Zeilen abschneiden. Das Resultat (also die jeweilige Datei ohne die ersten 43 Zeilen) soll die ursprüngliche Datei ersetzen.

    Klingt einfach, aber ich beiss' mir die Zähne aus :(.

    So sieht das bis jetzt aus:
    find . -name *_*.html -print -exec tail -n+43 {} \;

    Was jetzt passiert ist natürlich, dass das Resultat einfach auf der Konsole ausgegeben wird, es soll aber die jeweiligen Dateien ersetzen.

    Ich hoffe, ich drücke mich klar aus - das muss doch zu schaffen sein... Es geht übrigens darum, eine grosse Menge HTML-Dateien etwas umzuformatieren, wenn ich das Prinzip mal habe, glaube ich eigentlich, dass das hiermit recht einfach funktionieren würde.
     
    sheep, 24.10.2006
  2. oneOeight

    oneOeightMacUser Mitglied

    Mitglied seit:
    23.11.2004
    Beiträge:
    48.168
    Zustimmungen:
    3.887
    du musst natürlich den tail output redirecten mit >
    aber frag mich jetzt nicht, ob der dann nicht direkt die datei so überschreibt das du da einen loop hast ;)
     
    oneOeight, 24.10.2006
  3. sheep

    sheep Thread StarterMacUser Mitglied

    Mitglied seit:
    21.03.2005
    Beiträge:
    1.223
    Zustimmungen:
    24
    Darauf bin ich auch schon gekommen, das Problem ist, dass ich nicht weiss, was ich als Input angeben muss - ./ gibt Fehlermeldung, * ebenfalls.

    Gehen muss das ja irgendwie, das ist doch bestimmt keine sooo exotische Aufgabenstellung :).
     
    sheep, 24.10.2006
  4. oneOeight

    oneOeightMacUser Mitglied

    Mitglied seit:
    23.11.2004
    Beiträge:
    48.168
    Zustimmungen:
    3.887
    mit input meinst du auf was redirectet werden soll?
    du musst natürlich den filenamen nehmen, den dir find ausspuckt.
    frag mich jetzt nicht, wie man das jetzt macht, guck in die find man page ;)
     
    oneOeight, 24.10.2006
  5. sheep

    sheep Thread StarterMacUser Mitglied

    Mitglied seit:
    21.03.2005
    Beiträge:
    1.223
    Zustimmungen:
    24
    Ja eben, genau das finde ich nicht. Aus der man werde ich der Hinsicht überhaupt nicht schlau, eigentlich ist {} der Dateiname, aber das haut nicht hin (so wie es bis jetzt ist, schon, aber nicht als Ziel des Redirects).
     
    sheep, 24.10.2006
  6. autoexec.bat

    autoexec.batMacUser Mitglied

    Mitglied seit:
    21.01.2005
    Beiträge:
    2.113
    Zustimmungen:
    20
    Ohne dein Problem jetzt lösen zu können... was spricht gegen ein schönes kleines Bash-Script?

    z.B.

    Code:
    for x in `find . -name *_*.html -print`; do sed -e '1,43d' $x > $x; done
    
    Ich muss zugeben, ich hab es nicht getestet. Prinzipiell müsste es aber funktionieren. :teeth:
     
    autoexec.bat, 24.10.2006
  7. sheep

    sheep Thread StarterMacUser Mitglied

    Mitglied seit:
    21.03.2005
    Beiträge:
    1.223
    Zustimmungen:
    24
    Dieser Ansatz tut immerhin schon etwas. Das Problem ist, dass die Dateien dadurch gänzlich "ausgeleert" werden, sie sind alle noch da, aber gähnend leer.

    Hast du irgendeine Idee, wie das zustandekommt? Die Idee mit der Schleife ist wirklich hilfreich (ich verstehe die Funktionsweise von find nicht wirklich, daher hätte ich das nicht hinbekommen), vielen Dank schon mal dafür.
     
    sheep, 24.10.2006
  8. autoexec.bat

    autoexec.batMacUser Mitglied

    Mitglied seit:
    21.01.2005
    Beiträge:
    2.113
    Zustimmungen:
    20
    Hmm... merkwürdig. Scheint wohl irgendein Problem mit dem umleiten der Ausgaben zu sein. Sehe jetzt spontan nicht wirklich was das Problem ist.

    Was allerdings funktionieren müsste ist:

    Code:
    sed -i -e '1,43d'
    
    Da du damit schonmal das umleiten der Ausgabe gespart hast kannst du dir auch die for-Schleife sparen und das wieder in deinen find Befehl einbauen. Also

    Code:
     find . -name *_*.html -print -exec sed -i -e '1,43d' {} \;
    
    Also mir gefällts. :hehehe:
     
    autoexec.bat, 24.10.2006
  9. sheep

    sheep Thread StarterMacUser Mitglied

    Mitglied seit:
    21.03.2005
    Beiträge:
    1.223
    Zustimmungen:
    24
    @ autoexec.bat

    :hug:
    einfach göttlich, perfekt, wunderbar :).

    Vielen herzlichen Dank, das war echt eine grosse Hilfe!
     
    sheep, 25.10.2006
  10. maceis

    maceisMacUser Mitglied

    Mitglied seit:
    24.09.2003
    Beiträge:
    16.696
    Zustimmungen:
    602
    Noch kurz ein Wort zum Thema Ausgabeumleitung.
    Die Funktionsweise der Shell ist wie folgt.

    Es wird beim Analysieren der Befehlszeile erkannt, dass eine Ausgabeumleitung stattfindet (ohne append).
    Also wird zuerst eine leere Datei mit dem angegebenen Namen angelegt - und dabei die bereits vorhandene ersetzt.

    Anschließened wird diese leere Datei mit dem "sed"-Befehl bearbeitet.
    Das Ergebnis ist eine leere Datei.

    Mit der Z-Shell kann man sich übrigens den find-Befehl komplett schenken:
    Code:
    sed -i -e '1,43d' **/*_*.html
     
    maceis, 25.10.2006
Die Seite wird geladen...
Ähnliche Themen - find Dateien manipulieren
  1. isarcanoe
    Antworten:
    23
    Aufrufe:
    854
    isarcanoe
    26.06.2017
  2. Waldschrahdt
    Antworten:
    2
    Aufrufe:
    415
    Waldschrahdt
    02.11.2015
  3. lazybaer
    Antworten:
    3
    Aufrufe:
    676
  4. pfannkuchen2001
    Antworten:
    11
    Aufrufe:
    1.553
    Olivetti
    05.05.2011
  5. little_pixel
    Antworten:
    7
    Aufrufe:
    933
    little_pixel
    09.07.2007