S
s1ave77
Gast
Problem ist anscheinend, dass das Python-Skript bei der Namens-Generation den gesamten Pfad-String nutzt, anstatt in Dateiname + Zähler + Endung zu teilen.
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
Liegt daran, dass ich das zum Prinzip aufzeigen so gemacht habe. Ich finde es ja immer etwas seltsam, dass Windows beim Umbenennen von Dateien den Begriff "unbrauchbar" verwendet. Als ob der Name auch den Inhalt verändern würde.Marvolo schrieb:Es nummeriert die doppelten Dateien nun NACH der Dateiendung, wodurch die Datei damit unbrauchbar wird
Das Python Skript ist in dem Fall gerade dazu da, die Batchdatei zu erzeugen. Du brauchst dann kein Pythonskript mehr, wenn du die Batchdatei hast.Marvolo schrieb:Brauche ich das Python-Script nun überhaupt noch? Ich habe jetzt einfach diese Kopieren.bat-Datei gestartet,
Marvolo schrieb:Wie muss ich dein Script so abändern
echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
pushd "%~dp0"
cd "%~dp0"
if exist "search.txt" del /s /q "search.txt" >nul
for /r "e:\backup" %%A in (*.*) do echo %%~nA | findstr /l "WA0" 1>nul && echo %%A>>search.txt
pause
endlocal
exit
WA0
im Namen.Genau:Marvolo schrieb:einfach Zeile 7 entsprechend abändern?
for /r "f:\medien" %%A in (*.*) do echo %%~nA | findstr /l "WA0" 1>nul && echo %%A>>search.txt
Momentan erzeugt das PY-Skript die CMDs für Ordner und Copy, kann sie schnell und zuverlässig. Copy ist bei CMD gut aufgehoben.Marvolo schrieb:Oder ist es über das PY-script besser als über BAT? Solangsam verliere ich da auch den Überblick, was jetzt nun für was ist und was die beste Methode ist.
with open(indexfilename, encoding="utf8") as f2
) durch (with open(indexfilename) as f2
).import os
import pathlib
import shutil
target_root = os.path.abspath("F:/gefunden")
target_dopplungen = os.path.abspath("F:/gefunden/Dopplungen")
outputfilename = "scratch/output.txt"
indexfilename = "scratch/search.txt"
map = {}
# Einlesen der Pfade (die WhatsApp möchte) aus output.txt
with open(outputfilename, encoding="utf8") as f1:
count_dup = 0 # Duplikatzähler für Dateinamen in output.txt
for db_file in f1.readlines():
# print(db_file)
path, filename = os.path.split(db_file)
target_folder = os.path.relpath(path, "") # Pfadstruktur in Output.txt witd dann relativ zu target_root aufgefasst
target_folder = (os.path.join(target_root, target_folder))
# print(target_folder)
try:
dummy = (map[filename.rstrip()]["files"]) # Zugriffversuch, um festzustellen, ob es den KEy schon gibt
# print(filename)
count_dup +=1
except KeyError:
pass
map[filename.rstrip()] = {"files": [], "folder": target_folder}
print("Duplikate (Doppelte Dateinamen ungeachtet vom Pfad) in output.txt: " + str(count_dup))
# Einlesen der Pfade, die im Backupverzeichnis vorhanden sind, aus search.txt
with open(indexfilename, encoding="utf8") as f2:
for backup_file in f2.readlines():
try:
map[os.path.basename(backup_file).rstrip()]["files"].append(backup_file.rstrip())
except KeyError: # datei aus search.txt nicht in output.txt vorhanden
pass
#
makedirs_batch_file = open("01_Ordner_anlegen.bat", "w") # w für overwrite
no_dup = 0 # Anzahl Dateien mit genau einem Eintrag
single_match_batch_copy_file = open("02_Dateien_kopieren_SingleMatch.bat", "w", encoding="utf8")
n_duplicates = 0 # Anzahl an Einträgen, die nicht eindeutig sind
n_dup_files = 0 # Anzahl an betroffenen Dateien
duplicates_batch_copy_file = open("03_Dateien_kopieren_Duplikate.bat", "w", encoding="utf8")
n_not_found = 0 # Anzahl nicht gefundene Dateien
not_found_list_file = open("04_NotFoundInIndex.txt", "w", encoding="utf8")
# Map durchgehen
for filename_entry in map:
target = os.path.join(map[filename_entry]["folder"], filename_entry)
# makedirs_batch_file.write("mkdir \"" + os.path.dirname(target) + "\"" + "\n")
# # os.makedirs(os.path.dirname(target), exist_ok=True) # anlegen der Ordner in python
count = 1
if len(map[filename_entry]["files"]) == 0:
n_not_found += 1
not_found_list_file.write(filename_entry + "\n")
if len(map[filename_entry]["files"]) == 1:
no_dup += 1
source = map[filename_entry]["files"][0] # erster und einziger gefundener Eintrag
makedirs_batch_file.write("mkdir \"" + os.path.dirname(target) + "\"" + "\n")
single_match_batch_copy_file.write("copy \"" + source + "\" \"" + target + "\"" + "\n")
# shutil.copy(source, target) # Kopieren mit Python
if len(map[filename_entry]["files"]) > 1:
n_dup_files += 1
for count, source in enumerate(map[filename_entry]["files"]):
if count == 1:
target_new = target
pass
else:
name_no_extension = pathlib.Path(target).stem
extension = pathlib.Path(target).suffix
target_new = os.path.dirname(target) + name_no_extension + "_" + str(count) + extension
# print(target_new)
# print("Duplicate at " + target)
n_duplicates += 1
target_new = os.path.relpath(target_new, os.path.abspath(target_root))
target_new = (os.path.join(target_dopplungen, target_new))
makedirs_batch_file.write("mkdir \"" + os.path.dirname(target_new) + "\"" + "\n")
duplicates_batch_copy_file.write("copy \"" + source + "\" \"" + target_new + "\"" + "\n")
# shutil.copy(source, target)
pass
# Dateien schließen
makedirs_batch_file.close()
single_match_batch_copy_file.close()
duplicates_batch_copy_file.close()
print("Anzahl an Einträgen, die nicht eindeutig sind (Dateiname aus output.txt mehrfach in search.txt): " + str(n_duplicates))
print("Anzahl betroffene Dateinamen in output.txt: " + str(n_dup_files))
print("Anzahl eindeutige Einträge: " + str(no_dup))
print("Anzahl nicht gefundene Dateien: " + str(n_not_found))
Ja, alle Dateinamen, die mehrfach gefunden wurden, landen in dem Unterordner "Dopplungen." Kann man auch ändern, dann muss man halt bei Zeile 72 Ordnererstellung und Kopiervorgang einfügen und Zeilen 81 bis 95 in den else-Zweig schieben.Marvolo schrieb:kopiert es dort nicht nur die tatsächlichen Doppelungen (also die n+1, n+2, n+3te Kopie eines Originals), sondern auch das Original selbst?
simpsonsfan schrieb:Wenn das wirklich alles verschiedene Kopien derselben Datei sind, dann klingt das auch sinnvoll.
Wenn es unterschiedliche Dateien sind, die nur denselben Namen tragen, dann müsste man sie ja ohnehin alle überprüfen.
SentIMG-20200310-WA0000_4.jpg
statt Sent\IMG-20200310-WA0000_4.jpg
.Media/WhatsApp Images/Sent/IMG-20200310-WA0000.jpg
import os
import pathlib
import shutil
target_root = os.path.abspath("F:/gefunden")
target_dopplungen = os.path.abspath("F:/gefunden/Dopplungen")
outputfilename = "output.txt"
indexfilename = "search.txt"
map = {}
# Einlesen der Pfade (die WhatsApp möchte) aus output.txt
with open(outputfilename, encoding="utf8") as f1:
count_dup = 0 # Duplikatzähler für Dateinamen in output.txt
for db_file in f1.readlines():
# print(db_file)
path, filename = os.path.split(db_file)
target_folder = os.path.relpath(path, "") # Pfadstruktur in Output.txt witd dann relativ zu target_root aufgefasst
target_folder = (os.path.join(target_root, target_folder))
# print(target_folder)
try:
dummy = (map[filename.rstrip()]["files"]) # Zugriffversuch, um festzustellen, ob es den KEy schon gibt
# print(filename)
count_dup +=1
except KeyError:
pass
map[filename.rstrip()] = {"files": [], "folder": target_folder}
print("Duplikate (Doppelte Dateinamen ungeachtet vom Pfad) in output.txt: " + str(count_dup))
# Einlesen der Pfade, die im Backupverzeichnis vorhanden sind, aus search.txt
with open(indexfilename, encoding="utf8") as f2:
for backup_file in f2.readlines():
try:
map[os.path.basename(backup_file).rstrip()]["files"].append(backup_file.rstrip())
except KeyError: # datei aus search.txt nicht in output.txt vorhanden
pass
#
makedirs_batch_file = open("01_Ordner_anlegen.bat", "w") # w für overwrite
no_dup = 0 # Anzahl Dateien mit genau einem Eintrag
# single_match_batch_copy_file = open("02_Dateien_kopieren_SingleMatch.bat", "w", encoding="utf8")
first_match_batch_copy_file = open("02_Dateien_kopieren_FirstMatch.bat", "w", encoding="utf8")
n_duplicates = 0 # Anzahl an Einträgen, die nicht eindeutig sind
n_dup_files = 0 # Anzahl an betroffenen Dateien
duplicates_batch_copy_file = open("03_Dateien_kopieren_Duplikate.bat", "w", encoding="utf8")
n_not_found = 0 # Anzahl nicht gefundene Dateien
not_found_list_file = open("04_NotFoundInIndex.txt", "w", encoding="utf8")
# Map durchgehen
for filename_entry in map:
target = os.path.join(map[filename_entry]["folder"], filename_entry)
# makedirs_batch_file.write("mkdir \"" + os.path.dirname(target) + "\"" + "\n")
# # os.makedirs(os.path.dirname(target), exist_ok=True) # anlegen der Ordner in python
count = 1
if len(map[filename_entry]["files"]) == 0:
n_not_found += 1
not_found_list_file.write(filename_entry + "\n")
if len(map[filename_entry]["files"]) == 1:
no_dup += 1
source = map[filename_entry]["files"][0] # erster und einziger gefundener Eintrag
makedirs_batch_file.write("mkdir \"" + os.path.dirname(target) + "\"" + "\n")
first_match_batch_copy_file.write("copy \"" + source + "\" \"" + target + "\"" + "\n")
# shutil.copy(source, target) # Kopieren mit Python
if len(map[filename_entry]["files"]) > 1:
n_dup_files += 1
for count, source in enumerate(map[filename_entry]["files"]):
if count == 1:
makedirs_batch_file.write("mkdir \"" + os.path.dirname(target) + "\"" + "\n")
first_match_batch_copy_file.write("copy \"" + source + "\" \"" + target + "\"" + "\n")
target_new = target
pass
else:
name_no_extension = pathlib.Path(target).stem
extension = pathlib.Path(target).suffix
target_new = os.path.join(os.path.dirname(target), name_no_extension + "_" + str(count) + extension)
n_duplicates += 1
target_new = os.path.relpath(target_new, os.path.abspath(target_root))
target_new = (os.path.join(target_dopplungen, target_new))
makedirs_batch_file.write("mkdir \"" + os.path.dirname(target_new) + "\"" + "\n")
duplicates_batch_copy_file.write("copy \"" + source + "\" \"" + target_new + "\"" + "\n")
# shutil.copy(source, target)
pass
# Dateien schließen
makedirs_batch_file.close()
first_match_batch_copy_file.close()
duplicates_batch_copy_file.close()
print("Anzahl an Einträgen, die nicht eindeutig sind (Dateiname aus output.txt mehrfach in search.txt): " + str(n_duplicates))
print("Anzahl betroffene Dateinamen in output.txt: " + str(n_dup_files))
print("Anzahl eindeutige Einträge: " + str(no_dup))
print("Anzahl nicht gefundene Dateien: " + str(n_not_found))