Jen ze zkušenosti, já po mnoha letech dospěl k tomu, že když potřebuju jakoukoliv složitější utilitku tohoto typu, udělám to raději v pythonu, věci tam jsou mnohem, předvídatelnější, čitelnější, a typicky je jeden zjevný způsob jak to udělat. To že je to ukecanější považuju spíš za výhodu, je to srozumitelnější i pro ne-experty v bashi (kterých je většina), i pro mé budoucí já. Navíc se jako bonus učím jazyk užitečný i v jiných doménách.
A co na to ChatGPT? Poprosil jsem jí o převedení do Pythonu a rovnou i human readable přípony.
#!/usr/bin/python3
import os
import math
def convert_size(size_bytes):
if size_bytes == 0:
return "0B"
size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
i = int(math.floor(math.log(size_bytes, 1024)))
p = math.pow(1024, i)
s = round(size_bytes / p, 2)
return f"{s} {size_name[i]}"
# Nastavte cestu, kde chcete hledat soubory
search_dir = "."
# Nastavte názvy výstupních souborů
filenames_output = "nazvy_souboru.txt"
sizes_and_filenames_output = "velikosti_a_nazvy_souboru.txt"
# Odstraňte existující výstupní soubory
if os.path.exists(filenames_output):
os.remove(filenames_output)
if os.path.exists(sizes_and_filenames_output):
os.remove(sizes_and_filenames_output)
# Najděte soubory s velikostí mezi 10 a 20 MB
total_size = 0
with open(filenames_output, "a") as f_names, open(sizes_and_filenames_output, "a") as f_sizes_names:
for root, dirs, files in os.walk(search_dir):
for file in files:
file_path = os.path.join(root, file)
size = os.path.getsize(file_path)
if 10 * 1024 * 1024 <= size < 20 * 1024 * 1024:
# Přidejte název souboru do prvního souboru
f_names.write(file + "\n")
# Přidejte velikost a název souboru do druhého souboru
human_readable_size = convert_size(size)
f_sizes_names.write(f"{human_readable_size} {file}\n")
# Aktualizujte celkovou velikost
total_size += size
# Přidejte celkovou velikost na konec druhého souboru
with open(sizes_and_filenames_output, "a") as f:
human_readable_total_size = convert_size(total_size)
f.write(f"Celkova velikost: {human_readable_total_size}\n")