• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

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

Marlboro

Neu angemeldet

Registriert
25 Aug. 2013
Beiträge
29
Hallo zusammen,

ich will aus einem riesigen Ordner, gefüllt mit HTML-Dateien, die in der Struktur...[src=html4strict]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="de" xml:lang="de">
<head>

<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta http-equiv="content-language" content="de" />
<meta http-equiv="content-style-type" content="text/css" />
<meta http-equiv="imagetoolbar" content="no" />
<meta name="resource-type" content="document" />
<meta name="distribution" content="global" />
<meta name="copyright" content="2000, 2002, 2005, 2007 phpBB Group" />
<meta name="keywords" content="" />
<meta name="description" content="" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />

<title>INHALTVOMTITLETAG</title>

[/src]...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:
[src=perl]
for f in *.html;
do
title=$( grep -oP '(?<=<title>).*(?=<\/title>)' "$f" )
mv -i "$f" "${title//[^a-zA-Z0-9\._\- ]}".html
done[/src]
...und zwar hier: https://superuser.com/questions/546009/renaming-html-files-according-to-title-tag. Das funktioniert großartig, [KW]mv[/KW] 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 [KW]mv[/KW], 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 :m.

Hat jemand ggf. die Skriptanpassung parat :beer:?

M.
 
Zuletzt bearbeitet:

alter_Bekannter

N.A.C.J.A.C.

Registriert
14 Juli 2013
Beiträge
4.823
Ort
Midgard
Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

Häng einfach jedem eine laufende Nummer an.
 

Marlboro

Neu angemeldet

Registriert
25 Aug. 2013
Beiträge
29
  • Thread Starter Thread Starter
  • #3
Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

Aber wie? Oder anders: was muss anstatt [KW]+MITLAUFENDENUMMER[/KW] hier:[src=perl]mv -i "$f" "${title//[^a-zA-Z0-9\._\- ]}"+MITLAUFENDENUMMER.html
[/src]
stehen :D?
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.504
Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

[src=bash]$ man mv[/src]
Zeigt was mit numbered backups an
[src=bash]$ man mv | grep -C 3 backup[/src]
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/questions/371375/mv-add-number-to-file-name-if-the-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:

[src=bash]find . -name "*.html" -exec sh -c "grep -oP '(?<=<title>).*(?=<\/title>)' '{}' | xargs -I@ mv --backup=t '{}' @.html" \;[/src]

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 :D
 
Zuletzt bearbeitet:

Marlboro

Neu angemeldet

Registriert
25 Aug. 2013
Beiträge
29
  • Thread Starter Thread Starter
  • #5
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 :o.
Da war ich auch schon; da hat aber kein einziger Tipp geholfen; da bekomm ich dauernd Syntaxfehler.
[src=bash]find . -name "*.html" -exec sh -c "grep -oP '(?<=<title>).*(?=<\/title>)' '{}' | xargs -I@ mv --backup=t '{}' @.html" \;[/src]
Wie ist das zu nutzen:o?

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 :(.
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.504
Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

Es sollte ausreichen, wenn du statt

[src=bash]for f in *.html;
do
title=$( grep -oP '(?<=<title>).*(?=<\/title>)' "$f" )
mv -i "$f" "${title//[^a-zA-Z0-9\._\- ]}".html
done[/src]

Das hier nimmst:

[src=bash]for f in *.html;
do
title=$( grep -oP '(?<=<title>).*(?=<\/title>)' "$f" )
mv --backup=t "$f" "${title//[^a-zA-Z0-9\._\- ]}".html
done[/src]

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.
 

Marlboro

Neu angemeldet

Registriert
25 Aug. 2013
Beiträge
29
  • Thread Starter Thread Starter
  • #7
Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

Ha, geil :D. 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.
 

Metal_Warrior

Defender of Freedom
Teammitglied

Registriert
10 Aug. 2013
Beiträge
6.830
Ort
/dev/mapper/home
Re: Tausende HTML-Dateien umbenennen, neuer Name: Inhalt des title-Tags

Mir war im Zug grad langweilig:
[src=bash]#!/bin/bash

# Get parameter (directory)
WORKDIR="$1"

# Jumping to WORKDIR (if available), or stay in current work directory
if [ -d "$WORKDIR" ]
then
cd "$WORKDIR"
fi

# Get all relevant files
ls -1 | grep ".html" > /tmp/mvfile.tmp

# Cycle through file line by line
while read FILE
do
# Read only the first title line in header (you never know...)
NEWNAME=`grep -m 1 "<title>" "$FILE"`
# Snipping away the tags with Bash variable manipulation
# NOTE: You might have to tamper with the snipping points, if there's
# whitespaces in front or after the title tags
NEWNAME="${NEWNAME:7}"
NEWNAME="${NEWNAME:0:-8}"

# Handle potential errors
if [ "$NEWNAME" = "" ]
then
NEWNAME="error"
fi

# Outputs the determined title for you to spot errors prior to changes
# You may comment the next two lines out to enable automatic proceeding
echo "$NEWNAME"
read STOP

# Determining appendix number
NR=""
for NR in {0000..9999}
do
# Check that there is no file with desired name
if [ ! -f "${NEWNAME}_$NR.html" ]
then
# Rename file and break the loop
mv "$FILE" "${NEWNAME}_$NR.html"
break
fi
done

done < /tmp/mvfile.tmp

# Cleanup
rm /tmp/mvfile.tmp

# Exit gracefully
exit 0[/src]

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.
 
Zuletzt bearbeitet:

Marlboro

Neu angemeldet

Registriert
25 Aug. 2013
Beiträge
29
  • Thread Starter Thread Starter
  • #9
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.
 

Metal_Warrior

Defender of Freedom
Teammitglied

Registriert
10 Aug. 2013
Beiträge
6.830
Ort
/dev/mapper/home
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).
 
Oben