Seite 2 von 2
Re: Python - Code
Verfasst: Samstag 14. Dezember 2019, 11:31
von __blackjack__
Also stehen tut da ja (fette Hervorhebung von mir):
So I wrote the below python script, which takes 2 arguments:
- a directory inside multivol_snapshot/ containing the bits you want to restore
- a directory to put the restored files inside.
Also nicht "multivol_snapshot/" direkt sondern ein Verzeichnis *in* diesem Verzeichnis. Und dafür das Du nicht wirklich weisst was dieses Skript macht, finde ich es ziemlich mutig gleich das Heimatverzeichnis als Zielverzeichnis anzugeben, es sei denn das ist ein extra für diesen Versuch angelegtes Heimatverzeichnis.
Re: Python - Code
Verfasst: Samstag 14. Dezember 2019, 11:34
von Strunz_1975
Und wie würdest du das machen?
Ein Verzeichnis als Unterordner von "werner" anlegen (z.B.: /home/werner/Restore/)!
Mein Englisch ist nicht besonders gut, wie du sicherlich schon gemerkt hast!
Re: Python - Code
Verfasst: Samstag 14. Dezember 2019, 13:19
von __blackjack__
Ja genau, ich würde zum Testen einen extra Zielordner erstellen.
Für Englisch gibt's im Internet ja auch Werkzeuge zum übersetzen. Das ist zwar nicht perfekt, aber in der Regel brauchbar. Das Zitat oben maschinell übersetzt:
Also habe ich das folgende Python-Skript geschrieben, das 2 Argumente benötigt:
- ein Verzeichnis innerhalb von multivol_snapshot/, das die Bits enthält, die Sie wiederherstellen möchten.
- ein Verzeichnis, um die wiederhergestellten Dateien hineinzulegen.
Einzig „die Bits“ hätte man vielleicht besser mit „die Teile“ oder „die Dateien“ übersetzt. Aber auch so finde ich das schon verständlich. Ein Kollege von mir hat sich dafür ein Browserplugin installiert mit dem er markierten Text an verschiedene Übersetzungsdienste übergeben kann.
Re: Python - Code
Verfasst: Samstag 14. Dezember 2019, 13:21
von Strunz_1975
Danke schon mal im voraus!
Re: Python - Code
Verfasst: Samstag 21. Dezember 2019, 19:24
von Strunz_1975
__blackjack__ hat geschrieben: ↑Freitag 13. Dezember 2019, 18:09
@Srunz_1975: Ergänzend zu sparrow's Anmerkung zu `Path`: Warum ist das auskommentiert und warum wird ``os.path`` importiert aber nirgends im Programm verwendet‽
Die übergabe von `sys.argv` minus dem ersten Element kann man sich sparen weil man der `ArgumentParser.parse()` auch einfach gar nichts übergeben kann.
`sys.exit()` ist sinnfrei weil `FileReconstructor.reconstruct_files()` überhaupt keinen Rückgabewert hat.
Mindestens `copy_file_parts_to()` ist keine Methode sondern einfach nur eine Funktion die in die Klasse gesteckt wurde. Ich würde aber die ganze Klasse in Frage stellen.
Mal ohne die unnütze Klasse (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
import argparse
import shutil
from pathlib import Path
def walk_unpacked_leaf_dirs(unpacked_path):
"""
Based on the assumption that all leaf files are named as numbers.
"""
seen_dirs = set()
for path in unpacked_path.rglob("*"):
if path.is_file():
if path.parent not in seen_dirs:
seen_dirs.add(path.parent)
yield path.parent
def copy_file_parts_to(target_file, leaf_dir_path):
file_parts = sorted(leaf_dir_path.iterdir(), key=lambda x: int(x.name))
for file_part in file_parts:
with file_part.open("rb") as source_file:
shutil.copyfileobj(source_file, target_file)
def reconstruct_files(unpacked_path, restore_path):
for leaf_dir_path in walk_unpacked_leaf_dirs(unpacked_path):
target_path = restore_path / leaf_dir_path.relative_to(unpacked_path)
target_path.parent.mkdir(parents=True, exist_ok=True)
with target_path.open("wb") as target_file:
copy_file_parts_to(target_file, leaf_dir_path)
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument(
"unpacked_dir", help="The directory with the unpacked tar files"
)
parser.add_argument(
"restore_dir", help="The directory to restore files into"
)
return parser.parse_args()
def main():
args = parse_args()
reconstruct_files(
Path(args.unpacked_dir).resolve(), Path(args.restore_dir).resolve()
)
if __name__ == "__main__":
main()
Wenn ich es so schreibe, kommt folgende Fehlermeldung:
python3 DD.py /home/werner/Backup/Entpackt/multivol_snapshot/home/werner/Videos/TV-Serien/THE_BOURNE_LEGACY.iso/ /home/werner/Restore
Kommt folgende Fehlermeldung:
Code: Alles auswählen
Traceback (most recent call last):
File "DD.py", line 53, in <module>
main()
File "DD.py", line 48, in main
Path(args.unpacked_dir).resolve(), Path(args.restore_dir).resolve()
File "DD.py", line 30, in reconstruct_files
with target_path.open("wb") as target_file:
File "/usr/lib/python3.7/pathlib.py", line 1186, in open
opener=self._opener)
File "/usr/lib/python3.7/pathlib.py", line 1039, in _opener
return self._accessor.open(self, flags, mode)
IsADirectoryError: [Errno 21] Is a directory: '/home/werner/Restore'