BattleSheep
Anmeldungsdatum: 16. August 2018
Beiträge: 17
|
Hey Leute,
Ich bin ein echter Amateur was bash angeht.
Und zwar habe ich ein Backup mit über 1000 Datein von meinem Gameserver.
Darunter auch ziemlich viel Schrott von alten Plugins.
Ich hatte jetzt vor diesen neu aufzusetzen so das die installierten Plugins die Configdatein neu generieren.
Jetzt will ich aber nicht alle neu einrichten sondern die alten benutzen. Doch ist das bei der Menge an Dateien sogut wie unmöglich
jedesmal einzeln nachzugucken ob diese Datei neu generiert wurde oder nicht. Ich denke das script sollte ungefährt die Logik haben If (Gameserver contains FileA) then
Copy FileA from Backup to Gameserver and Overwrite existing file.
For each file in Backup Alle anderen datein sollen nicht Kopiert werden. Ich hoffe ich konnte das so halbwegs erklären
Ich bedanke mich schonmal im vorraus für hilfe ☺
|
NORACSA
Anmeldungsdatum: 31. Januar 2010
Beiträge: 180
|
Wie wärs wenn du dir dazu einfach die Dateiliste vom Gameserver holst und diese abarbeitest?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Nur minimal getestet! "new" ist das Zielverzeichnis, "backup" ist das Verzeichnis, aus dem Du die Dateien holen willst. | find new -type f -printf "$(readlink -f backup)/%P\0" | xargs -r0 cp -t new -av
|
Am besten zunächst ein "echo" vor dem "cp" einfügen um zu sehen, was passieren würde!
|
BattleSheep
(Themenstarter)
Anmeldungsdatum: 16. August 2018
Beiträge: 17
|
rklm schrieb: Nur minimal getestet! "new" ist das Zielverzeichnis, "backup" ist das Verzeichnis, aus dem Du die Dateien holen willst. | find new -type f -printf "$(readlink -f backup)/%P\0" | xargs -r0 cp -t new -av
|
Am besten zunächst ein "echo" vor dem "cp" einfügen um zu sehen, was passieren würde!
Danke dir hat wunderbar funktioniert, habe es mit 3 testordnern getestet.
Da ich aber auch gerne lernen möchte, was macht das "/%Ü\0" ? NORACSA schrieb: Wie wärs wenn du dir dazu einfach die Dateiliste vom Gameserver holst und diese abarbeitest?
Ohne dich jetzt angreifen zu wollen, aber wenn dir einer sagt Installiere und Konfiguriere dein Ubuntu neu weil dein Upgrade fehlschlägt, ist das die Antwort die du dir hier im forum erhofft hast? Ist das die Lösung deines Problems? Ich denke nicht und du weißt auch genau was ich meine ☺
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
BattleSheep schrieb: Da ich aber auch gerne lernen möchte, was macht das "/%Ü\0" ?
Da steht /%P\0 - das ist wichtig, weil man in der Manpage von find kein %Ü findet. Wenn du dir mal den Abschnitt zum Argument -printf ansiehst, findest du das: \0 ASCII NUL.
[...]
%P File's name with the name of the starting-point under which it was found
removed.
Das printf baut also für jede gefundene Datei aus dem Ergebnis von $(readlik -f backup) und dem relativen Pfad der gefundenen Datei einen null-terminierten String, der dann auf stdout an xargs weitergereicht wird. Das wird seinerseits mit dem Argument -0 gestartet wird und dadurch seine Eingabe auf stdin an jedem \0 auftrennt. Da \0 im Gegensatz zu Zeilenumbrüchen, Tabs und sonstigem Whitespace in Pfaden nicht vorkommen darf, eignet es sich hervorragend als eindeutiges Trennzeichen.
|
NORACSA
Anmeldungsdatum: 31. Januar 2010
Beiträge: 180
|
BattleSheep schrieb:
Ohne dich jetzt angreifen zu wollen, aber wenn dir einer sagt Installiere und Konfiguriere dein Ubuntu neu weil dein Upgrade fehlschlägt, ist das die Antwort die du dir hier im forum erhofft hast? Ist das die Lösung deines Problems? Ich denke nicht und du weißt auch genau was ich meine ☺
War ja auch nicht böse gemeint, ich wollte nur anregen den umkehrten Ansatz zu wählen, d.h. ein Verzeichnislisting zB mit ls -a am Server und diese Dateien dann hochzuladen.
Oder meinst du, dass dir hierzu die technischen Grundlagen fehlen?
|
BattleSheep
(Themenstarter)
Anmeldungsdatum: 16. August 2018
Beiträge: 17
|
seahawk1986 schrieb: BattleSheep schrieb: Da ich aber auch gerne lernen möchte, was macht das "/%Ü\0" ?
Da steht /%P\0 - das ist wichtig, weil man in der Manpage von find kein %Ü findet. Wenn du dir mal den Abschnitt zum Argument -printf ansiehst, findest du das: \0 ASCII NUL.
[...]
%P File's name with the name of the starting-point under which it was found
removed.
Das printf baut also für jede gefundene Datei aus dem Ergebnis von $(readlik -f backup) und dem relativen Pfad der gefundenen Datei einen null-terminierten String, der dann auf stdout an xargs weitergereicht wird. Das wird seinerseits mit dem Argument -0 gestartet wird und dadurch seine Eingabe auf stdin an jedem \0 auftrennt. Da \0 im Gegensatz zu Zeilenumbrüchen, Tabs und sonstigem Whitespace in Pfaden nicht vorkommen darf, eignet es sich hervorragend als eindeutiges Trennzeichen.
Das habe ich dann denke ich verstanden, aber was macht dann das "/", würde jetzt denken für die formatieren das die dateien in der variable das format "/dateiname" haben, liege ich da richtig? NORACSA schrieb: BattleSheep schrieb:
Ohne dich jetzt angreifen zu wollen, aber wenn dir einer sagt Installiere und Konfiguriere dein Ubuntu neu weil dein Upgrade fehlschlägt, ist das die Antwort die du dir hier im forum erhofft hast? Ist das die Lösung deines Problems? Ich denke nicht und du weißt auch genau was ich meine ☺
War ja auch nicht böse gemeint, ich wollte nur anregen den umkehrten Ansatz zu wählen, d.h. ein Verzeichnislisting zB mit ls -a am Server und diese Dateien dann hochzuladen.
Oder meinst du, dass dir hierzu die technischen Grundlagen fehlen?
Von mir auch nicht, aber es sind wirklich zu viele json dateien die entweder konfigurationen enthalten oder informationen als struct wenn ich das so beschreiben kann 😀 Die Technischen grundlagen fehlen mir sicher nicht. ☺
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
BattleSheep schrieb: Das habe ich dann denke ich verstanden, aber was macht dann das "/", würde jetzt denken für die formatieren das die dateien in der variable das format "/dateiname" haben, liege ich da richtig?
Ja genau, du brauchst ja mindestens einen Pfadtrenner (unter Linux also ein "/") zwischen Ordner- und Dateiname. Der Ordnername kommt dabei aus $(readlink -f backup) .
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
BattleSheep schrieb:
Das habe ich dann denke ich verstanden, aber was macht dann das "/", würde jetzt denken für die formatieren das die dateien in der variable das format "/dateiname" haben, liege ich da richtig?
Welche Variable? Da ist tatsächlich keine im Spiel. Das einzige, das Du als Variable betrachten kannst, ist "%P", weil das nämlich durch den Pfad der Datei relativ zum Startpunkt der Suche ersetzt wird. Wie schon von seahawk1986 schon hervorragend beschrieben, sorgt die Formatierung mit "-printf" dafür, dass eine Zeichenkette ausgegeben wird, die mit dem absoluten Pfad des Quellverzeichnisses beginnt, dann einen Trenner ("/") hat, gefolgt vom Pfad der gefundenen Datei relativ zum Ausgangspunkt der Suche und schließlich mit einem ASCII NUL Zeichen ("\0") endet.
|
BattleSheep
(Themenstarter)
Anmeldungsdatum: 16. August 2018
Beiträge: 17
|
rklm schrieb: BattleSheep schrieb:
Das habe ich dann denke ich verstanden, aber was macht dann das "/", würde jetzt denken für die formatieren das die dateien in der variable das format "/dateiname" haben, liege ich da richtig?
Welche Variable? Da ist tatsächlich keine im Spiel. Das einzige, das Du als Variable betrachten kannst, ist "%P", weil das nämlich durch den Pfad der Datei relativ zum Startpunkt der Suche ersetzt wird. Wie schon von seahawk1986 schon hervorragend beschrieben, sorgt die Formatierung mit "-printf" dafür, dass eine Zeichenkette ausgegeben wird, die mit dem absoluten Pfad des Quellverzeichnisses beginnt, dann einen Trenner ("/") hat, gefolgt vom Pfad der gefundenen Datei relativ zum Ausgangspunkt der Suche und schließlich mit einem ASCII NUL Zeichen ("\0") endet.
Das $ steht doch für eine Temporäre Terminal Variable oder nicht?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
$(readlink -f backup) ist eine Command Substitution und führt den in den Klammern enthaltenen Befehl in einer Subshell aus und ersetzt das Konstrukt mit der Ausgabe des Befehls auf stdout.
|