So, erste Version steht.
Gebrauchsanweisung:
Ich davon aus, dass du kein Python installiert hast.
Ich empfehle WinPython, da das recht easy ist:
Für das kleine Script reichen diese Versionen:
WinPython64-
3.8.7.0dot = Python 3.8 64bit only
WinPython32-
3.8.7.0dot = Python 3.8 32bit only
Du benutzt vermutlich ein 64bit-System, dann kannst du ruhig die Version nehmen. Wenn du dir nicht sicher bist, dann nimm die 32bit-Version.
Download unter:
https://github.com/winpython/winpython/releases/tag/3.0.202011219
Falls Windows mal wieder herummuckt, auf "Weitere Informationen" und dann auf "Trotzdem ausführen" klicken.
Du kannst es ruhig auf "C:\" entpacken.
Doppelklick auf "WinPython Command Prompt.exe":
Das Script aufrufen (den Übergabepfad musst du natürlich auf deinen Bedarf anpassen):
Zugucken, abwarten und Tee trinken:
usw....
Je nachdem auf wie vielen Bytes die Prüfung stattfindet und wie viele Dateien geprüft werden, kann das durchaus dauern.
Die Dauer hängt unter anderem davon ab, auf welche Länge an Bytes, die Anzahl der zu prüfenden Dateien und dem Typ der Festplatte ab.
Kleiner Benchmark (mit 1024 Bytes Prüfblock) bei mir:
Laufwerk: 260 GB an Daten, SSD, sehr viele Dateien (etwa 1.4 Millionen) -> etwa 90 Minuten
Das Script kannst du gern anpassen. Kaputt machen kannst du da nicht viel. Nur nicht os.remove auf dem Datenträger ausführen.
Da das Script (Lizenz:
"THE BEER-WARE LICENSE") kleiner als 100 Zeilen ist, stelle ich das dann doch hier hinein.
Wenn es Fragen gibt, kannst du mich gern per PN kontaktieren. Das hält den Thread sauber. Vielleicht findest du ja Gefallen, dir bei Bardarf auch kleine Helferchen zu scripten.
Relevante Variablen für dich im Script sind :
Zeile 4: "number_of_bytes = 1024" Es wird ein Muster (pattern) von 1024 "leeren" Bytes erstellt mit dem dann die ersten 1024 Bytes einer zu prüfenden Datei verglichen werden.
Zeile 6: "p = Path(r'E:\\')". Hier den Laufwerksbuchstaben oder Ordner anpassen, falls es nicht passen sollte. In dem Fall prüft er die komplette Partition E.
Python:
import sys, os
from pathlib import Path
# Number of first bytes from a file that we are compare
number_of_bytes = 1024
# Path that we will examine
p = Path(r'E:\\')
# Create pattern of \x00
pattern = b''
for _i in range(number_of_bytes):
pattern += b'\x00'
# Report files
filename_null_character = str("NullCharacterFiles.txt")
filename_not_null_character = str("NotNullCharacterFiles.txt")
filename_exceptions = str("ExceptionFiles.txt")
# Remember exception files and print it at the end of the process
list_of_exception_files = []
# Delete files, if they are exists to begin fresh files
if os.path.isfile(filename_null_character):
os.remove(filename_null_character)
if os.path.isfile(filename_not_null_character):
os.remove(filename_not_null_character)
if os.path.isfile(filename_exceptions):
os.remove(filename_exceptions)
# Traverse path
for file_name in p.glob('**/*'):
# Don't compare symbolic links
if os.path.islink(file_name):
continue
# Don't check direcories (doesn't have a "size")
if os.path.isdir(file_name):
print(str("Pruefe Verzeichnis: ") + str(file_name))
continue
try:
with open(file_name, 'rb') as f:
first_bytes_block = f.read(number_of_bytes)
# Compare if the first block of the file matchs the pattern
if first_bytes_block == pattern:
with open(filename_null_character, "a", encoding ="utf-8") as file_object:
line = str(file_name) + "\n"
file_object.write(line)
#print(str('Startblock besteht ausschliesslich aus \\x00: ') + str(file_name))
else:
with open(filename_not_null_character, "a", encoding ="utf-8") as file_object:
line = str(file_name) + "\n"
file_object.write(line)
#print(str('Startblock besteht ausschliesslich nicht nur aus \\x00: ') + str(file_name))
except:
exception_string = str("Ausnahme: ") + str(file_name).encode('utf-8', 'replace').decode()
list_of_exception_files.append(exception_string)
with open(filename_exceptions, "a", encoding ="utf-8") as file_object:
line = str(file_name.as_uri) + "\n"
file_object.write(line)
#print(exception_string)
print("===============================================")
print(*list_of_exception_files, sep = "\n")
print("===============================================")
print("Prozess durchgelaufen")
print(str(filename_null_character) + ", " + str(filename_exceptions) + " und " + str(filename_not_null_character) + " je nach Fall erstellt.")
Info:
Viele ISO-Dateien und andere Images enthalten am Anfang sehr viele Nullbytes. Warum auch immer.
Ist mir aufgefallen.
Nimm im Zweifel einen Hex-Editor wie diesen hier:
https://github.com/echo-devim/fhex
Das Script ist auch als Upload angehängt. Da keine Pythondateien erlaubt sind, musst du nach dem Download die Dateiendung auf *.py ändern.