Ergebnis 1 bis 10 von 10

Thema: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags [erledigt]

  1. #1

    Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags [erledigt]

    Hallo zusammen,

    ich will aus einem riesigen Ordner, gefüllt mit HTML-Dateien, die in der Struktur...
    Code (HTML):
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="de" xml:lang="de">
    3.  
    4. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    5. <meta http-equiv="content-language" content="de" />
    6. <meta http-equiv="content-style-type" content="text/css" />
    7. <meta http-equiv="imagetoolbar" content="no" />
    8. <meta name="resource-type" content="document" />
    9. <meta name="distribution" content="global" />
    10. <meta name="copyright" content="2000, 2002, 2005, 2007 phpBB Group" />
    11. <meta name="keywords" content="" />
    12. <meta name="description" content="" />
    13. <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
    14.  
    15. <title>INHALTVOMTITLETAG</title>
    16.  
    17.  
    ...vorliegen, gerne die title-Tags in die Dateinamen bekommen. Da das ganze ein Forenrip ist, sind die Dateinamen derzeitig auf die Foren- und Thread-IDs beschränkt, das ist nicht sonderlich hilfreich so.

    Bisher fand ich jenes Skript:
    Code (Perl):
    1.  
    2. for f in *.html;
    3. do
    4.    title=$( grep -oP '(?<=<title>).*(?=<\/title>)' "$f" )
    5.    mv -i "$f" "${title//[^a-zA-Z0-9\._\- ]}".html  
    6. done
    ...und zwar hier: https://superuser.com/questions/5460...g-to-title-tag. Das funktioniert großartig, mv macht da aber glaub ich Probleme. Bestehen nämlich mehrere HTML-Dokumente, in denen der Inhalt das title-Tags der gleiche ist, werden die nach den ersten umbenannten Dateien ebenfalls den angegebenen Kriterien entsprechen, gelöscht.

    Was fehlt mv, dass das nicht passiert und dem ganzen automatisch eine Art von Durchzählung angehängt? Meinetwegen gerne #### vierstellig von Anfang an und dann halt hochgezählt. Wo finde ich Rat, sowas nachzugucken, ich weiß leide rnichtmal wie ich da weitergoogeln sollte .

    Hat jemand ggf. die Skriptanpassung parat ?

    M.
    Geändert von Marlboro (22.06.18 um 23:47 Uhr)

  2. #2
    N.A.C.J.A.C. Avatar von alter_Bekannter
    Registriert seit
    Jul 2013
    Ort
    Midgard
    Beiträge
    4.076

    Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

    Häng einfach jedem eine laufende Nummer an.
    Wichtig: Warum die Installation von Win XP ein Linuxproblem ist.

    Autos töten keine Menschen, sie beschützen sie, vor Menschen mit kleineren Autos.

  3. #3
    Mitglied

    (Threadstarter)


    Registriert seit
    Aug 2013
    Beiträge
    16

    Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

    Aber wie? Oder anders: was muss anstatt +MITLAUFENDENUMMER hier:
    Code (Perl):
    1. mv -i "$f" "${title//[^a-zA-Z0-9\._\- ]}"+MITLAUFENDENUMMER.html  
    2.  
    stehen ?

  4. #4
    Bot #0384479 Avatar von BurnerR
    Registriert seit
    Jul 2013
    Beiträge
    3.681
    ngb:news Artikel
    1

    Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

    Code (Bash):
    1. $ man mv
    Zeigt was mit numbered backups an

    Spoiler: 


    Code (Bash):
    1. $ man mv | grep -C 3 backup
    Die obligatorischen Argumente für Optionen sind für deren Kurz- und Langform gleich.

    --backup[=STEUERUNG]
    Eine Sicherungskopie von jeder vorhandenen Zieldatei erstellen

    -b Wie --backup, akzeptiert aber kein Argument

    -f, --force
    Vor dem Überschreiben nicht nachfragen
    --
    Versionsinformation anzeigen und beenden

    Die Endung für Sicherheitskopien ist »~«, außer wenn sie mit --suffix oder SIMPLE_BACKUP_SUFFIX gesetzt wurde. Die Methode der Versionssteuerung kann mit der Option
    --backup oder der Umgebungsvariablen VERSION_CONTROL ausgewählt werden. Mögliche Werte sind:

    none, off
    Niemals Sicherheitskopien erstellen (selbst wenn --backup angegeben wurde)

    numbered, t
    Erstellen von nummerierten Sicherheitskopien



    Ausführlicheres gibt es z.B. hier:
    https://unix.stackexchange.com/quest...-target-exists

    Erster Treffer bei google mit "mv add suffix if exists"

    As the answer to the question you linked already states, mv can suffix files that would otherwise get overwritten by the file you move with a number to give them a unique file name:

    mv --backup=t <source_file> <dest_file>
    --- [2018-06-22 10:39 CEST] Automatisch zusammengeführter Beitrag ---

    Just for te lulz ohne for-loop, sondern mit find:

    Code (Bash):
    1. find . -name "*.html" -exec sh -c "grep -oP '(?<=<title>).*(?=<\/title>)' '{}' | xargs -I@ mv --backup=t '{}' @.html" \;
    Erhält jedoch nicht die Original Dateinamen. Sondern nimmt als neuen Dateinamen einfach das was im title-tag steht.
    Weiß jemand, wie man das machen kann, dass er das nur als prefix verwendet??
    btw., genau wie obige Lösung im Beitrag mit for loop wird auch hier die Nummerierung hinter das .html gesetzt, also:
    file.html
    file.html.~1~
    file.html.~2~

    aber das erschlägt man ja auch recht schnell mit rename und co
    Für diesen Beitrag bedankt sich Marlboro
    Geändert von BurnerR (22.06.18 um 10:40 Uhr) Grund: Ausgabe der im Spoiler steht aufgehübscht (grep paramter)

  5. #5
    Mitglied

    (Threadstarter)


    Registriert seit
    Aug 2013
    Beiträge
    16

    Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

    @BurnerR: Danke! Die Manpage hatte ich auch schon offen, die Instruktionen aber nicht verstanden .
    Zitat Zitat von BurnerR Beitrag anzeigen
    Ausführlicheres gibt es z.B. hier: https://unix.stackexchange.com/quest...-target-exists
    Da war ich auch schon; da hat aber kein einziger Tipp geholfen; da bekomm ich dauernd Syntaxfehler.
    Zitat Zitat von BurnerR Beitrag anzeigen
    Code (Bash):
    1. find . -name "*.html" -exec sh -c "grep -oP '(?<=<title>).*(?=<\/title>)' '{}' | xargs -I@ mv --backup=t '{}' @.html" \;
    Wie ist das zu nutzen?

    Hast du vielleicht einen zusammenhängenden Codeschnippsel der hier ohne weitere Anpassung funktioniert, ich versteh von dem Zeuch so wenig, dass Anpassungen auf meiner Seite offensichtlich eher weg als zum Ziel führen .

  6. #6
    Bot #0384479 Avatar von BurnerR
    Registriert seit
    Jul 2013
    Beiträge
    3.681
    ngb:news Artikel
    1

    Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

    Es sollte ausreichen, wenn du statt

    Code (Bash):
    1. for f in *.html;
    2. do
    3.    title=$( grep -oP '(?<=<title>).*(?=<\/title>)' "$f" )
    4.    mv -i "$f" "${title//[^a-zA-Z0-9\._\- ]}".html  
    5. done
    Das hier nimmst:

    Code (Bash):
    1. for f in *.html;
    2. do
    3.    title=$( grep -oP '(?<=<title>).*(?=<\/title>)' "$f" )
    4.    mv --backup=t "$f" "${title//[^a-zA-Z0-9\._\- ]}".html  
    5. done
    Da ist einfach der Parameter -i bei mv durch --backup=t ersetzt.



    Wie ist das zu nutzen?
    So nachm Kaffee weiß ich grad gar nicht, ob es so gesund ist, find und mv aufs selbe Verzeichnis anzuwenden... oder ob man nicht auf jeden Fall in ein sub-dir schieben sollte..

    Aber generell: So einen Befehl kann man so 1:1 ist einer Bash-Shell eingeben und ausführen.

  7. #7
    Mitglied

    (Threadstarter)


    Registriert seit
    Aug 2013
    Beiträge
    16

    Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

    Ha, geil . Dann hatte ich den Code zumindest richtig angepasst - dann muss irgendwo anders der Fehler sein. Ich hab testweise einfach mal den 18-zeiligen HTML-Code von oben in ein frisches HTML-Dokument gepackt und das ein paar mal dupliziert; in der Hoffnung, dass das Skript das dann schön durchnummeriert:



    ...Leider aber passiert auch damit nach dem Entern folgendes:



    .

    M.

  8. #8
    Defender of Freedom

    Administrator

    Avatar von Metal_Warrior
    Registriert seit
    Aug 2013
    Ort
    /dev/mapper/home
    Beiträge
    3.226
    ngb:news Artikel
    6

    Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

    Mir war im Zug grad langweilig:
    Code (Bash):
    1. #!/bin/bash
    2.  
    3. # Get parameter (directory)
    4. WORKDIR="$1"
    5.  
    6. # Jumping to WORKDIR (if available), or stay in current work directory
    7. if [ -d "$WORKDIR" ]
    8.   then
    9.     cd "$WORKDIR"
    10. fi
    11.  
    12. # Get all relevant files
    13. ls -1 | grep ".html" > /tmp/mvfile.tmp
    14.  
    15. # Cycle through file line by line
    16. while read FILE
    17.   do
    18.     # Read only the first title line in header (you never know...)
    19.     NEWNAME=`grep -m 1 "<title>" "$FILE"`
    20.     # Snipping away the tags with Bash variable manipulation
    21.     # NOTE: You might have to tamper with the snipping points, if there's
    22.     # whitespaces in front or after the title tags
    23.     NEWNAME="${NEWNAME:7}"
    24.     NEWNAME="${NEWNAME:0:-8}"
    25.  
    26.     # Handle potential errors
    27.     if [ "$NEWNAME" = "" ]
    28.       then
    29.         NEWNAME="error"
    30.     fi
    31.    
    32.     # Outputs the determined title for you to spot errors prior to changes
    33.     # You may comment the next two lines out to enable automatic proceeding
    34.     echo "$NEWNAME"
    35.     read STOP
    36.    
    37.     # Determining appendix number
    38.     NR=""
    39.     for NR in {0000..9999}
    40.       do
    41.         # Check that there is no file with desired name
    42.         if [ ! -f "${NEWNAME}_$NR.html" ]
    43.           then
    44.             # Rename file and break the loop
    45.             mv "$FILE" "${NEWNAME}_$NR.html"
    46.             break
    47.         fi
    48.       done
    49.      
    50.   done < /tmp/mvfile.tmp
    51.  
    52. # Cleanup
    53. rm /tmp/mvfile.tmp
    54.  
    55. # Exit gracefully
    56. exit 0
    Hab ich jetzt nicht getestet, sollte aber so laufen.

    --- [2018-06-22 20:32 CEST] Automatisch zusammengeführter Beitrag ---

    @BurnerR: Das "for i in *.html" wird dir wahrscheinlich Scheiße produzieren, wenn du Leerzeichen in den Namen hast. Sollte nicht sein, ist aber möglich (nur für den Fall, dass hier ein anderer das zum Beispiel für MP3s umbauen will). Zumindest hat er bei mir da grad jedes einzelne "Wort" als Datei erkannt (wobei ich die Vorauswahl über ls -1 und grep getroffen habe). Daher gehe ich bei mir den Umweg über ne File, die ich Line by Line auslese. So ist sicher, dass jede Line genau eine existente Zieldatei ist.

    BTW: Warum ich die Backupfunktion von ls hier nicht verwende, hat folgenden Grund: Soweit ich mich erinnere, wird die überschriebene Datei ins Backup geschoben, und nicht die soeben umzubenennende Datei mit Appendix versehen. D. h. wenn du einen Threadtitel hast wie "Bar" ohne Seitenangabe, den Ursprungstitel aber als "id05_p001", "id05_p002" etc., würde er die letzte Seite des Forums als Bar.html abspeichern, danach die erste Seite des Threads als Bar001.html, die zweite als "Bar002.html" etc., und du musst bei der letzten Seite nachtarieren. Das hab ich mit abgefrühstückt. Wenn er die erste Seite als 0001 haben will, muss er nur das entsprechende Startstatement in der FOR-Schleife abändern.
    Für diesen Beitrag bedankt sich Marlboro
    Geändert von Metal_Warrior (22.06.18 um 20:44 Uhr) Grund: Depperter Tippfehler
    GCM/IT/S/O d-(--) s+:- a? C++(+++) UL+++(++++)$ P L+++>++++ W++ w@$ M--$ PS+(++) PE(-) Y+(++) PGP++(+++) t+ 5(+) R* !tv b+(++++) DI(++) G++ e+>++++ h(--) y?
    Das Ende ist nahe: Dem Harleyschen Kometen folgt der Gammablitz beim Scheißen.

  9. #9
    Mitglied

    (Threadstarter)


    Registriert seit
    Aug 2013
    Beiträge
    16

    Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

    Geil, vielen vielen Dank - das hat sehr geholfen!

    Irgendwie musste ich das mehhmals ausführen, damit auch alle Dateien umbenannt wurden und bei ganz wenigen hat das Skript rumgeblöckt, wenn im title-Tag ein Slash drin war - da das dann als neuer Speicherpfad gedacht wurde. Da hab ich aber einen Workaround gefunden .

    1000Dank für eure Hilfe <3.

  10. #10
    Defender of Freedom

    Administrator

    Avatar von Metal_Warrior
    Registriert seit
    Aug 2013
    Ort
    /dev/mapper/home
    Beiträge
    3.226
    ngb:news Artikel
    6

    Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

    @Marlboro: Gut, wenn nen Slash im Title-Statment ist, kannst du das per sed noch durch was anderes ersetzen lassen. Etwa so: "sed s/\//-/g" - wobei ich mir bei Sed nie sicher bin und sowas immer mit nem Teststring im Terminal ausprobiere. Und eigentlich hätte es direkt für alle Dateien durchlaufen müssen, es sei denn, du hattest welche in Unterordnern (es geht absichtlich keine Subdirs durch).
    Für diesen Beitrag bedankt sich Marlboro
    GCM/IT/S/O d-(--) s+:- a? C++(+++) UL+++(++++)$ P L+++>++++ W++ w@$ M--$ PS+(++) PE(-) Y+(++) PGP++(+++) t+ 5(+) R* !tv b+(++++) DI(++) G++ e+>++++ h(--) y?
    Das Ende ist nahe: Dem Harleyschen Kometen folgt der Gammablitz beim Scheißen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •