find do dvou souborů

Re:find do dvou souborů
« Odpověď #15 kdy: 28. 04. 2023, 12:47:54 »
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.

Kód: [Vybrat]
#!/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")


Re:find do dvou souborů
« Odpověď #16 kdy: 28. 04. 2023, 13:07:01 »
Václav Ovsik, muzete prosim vysvetlit co dela ten radek s perl? Co je vystupem
Kód: [Vybrat]
perl -ne 'm/^(\d+)/; ? to hleda soubory nebo to ma nejak nacist velikosti z toho predchoziho prikazu... toto absolutne nechapu i kdyz regex rozumim... A proc je tam END? END jako konec smycky v perlu? To asi dava smysl. Nechapu ale jak se dostaly data z find do perl

Jo to je match regulárního výrazu. Perl je použit místo awk (s volbou -n). Takže prochází řádky, pro každý udělá ten match číslic na začátku řádku a posčítá je to $sum. to co je za END je sekce která se provede na konci a tedy se vytiskne ten součet...

Re:find do dvou souborů
« Odpověď #17 kdy: 28. 04. 2023, 18:32:36 »
Ta "< <(program)" syntaxe je bash-only feature, ze? To neni vytka, jen ujistujici dotaz.

OT: K3dar - ten, kdo ve staroveku obhospodaroval linux na Palm T3, nebo jen shoda "jmen"? ;-)
je to rozsireni bashe jestli to umi i nejaky dalsi lepsi shell netusim, pouzivam vsude bash :-)

ad OT: jj, sem to ja :) a to uz bude pres 15let... ve webarchivu to koukam jeste zustalo :)

A smim rozsirujici dotaz na ten proccess substitution? Jak by to tedy bylo, kdybychom chteli vzit
Kód: [Vybrat]
sort -k 9 <(ls -l /bin) <(ls -l /usr/bin) <(ls -l /usr/X11R6/bin)a vyfiltrovat z toho jenom ty soubory ktere jsou unikatni jmenem a velikosti, pripadne jenom jmenem? Predpokladam, ze by se tam pouzil diff. Ja zkousel toto..
Kód: [Vybrat]
diff<(sort -k 9 <(ls -l /bin) <(ls -l /usr/bin) <(ls -l /usr/X11R6/bin))

Re:find do dvou souborů
« Odpověď #18 kdy: 28. 04. 2023, 18:39:24 »
Tak jo, presvedcili jste mi ja si toho bota zkusim poridit. Ale jen pokud to neni chlap, je to zenska a ma kolektivni vedomi  :) Mozna pak bude programovat misto me nebo mi najde chyby v programech. A komunikuje se s tim cesky nebo ji musim teprve cesky naucit?

Re:find do dvou souborů
« Odpověď #19 kdy: 28. 04. 2023, 20:06:06 »
Citace
perl - n -e -p

Doporučuji tyto zdroje:
https://hashrocket.com/blog/posts/ruby-on-the-command-line
https://nithinbekal.com/posts/ruby-sed-awk/ (s Links dole)
Je dost coll vychytávka, která dokaže zawkovat a zsedovat spoustu skriptů

Následující píšu k jazyku ruby, kde to snad je stejné

-e = eval code " tedy že kód skriptu" je argument příkazu za e
-n= obalí   kód while gets();...;end (+ tam jsou nějaké servisní deklarace a skrytý kód)
-p= totéž akorát uvnitř smyčku je ještě na konci print


dokonce to došlo tak daleko že lze dělat
ruby -e 'BEGIN {a=0;}  a+=/\d+/.size ; print; END {puts a;}'

https://catonmat.net/awk-one-liners-explained-part-two
https://learnbyexample.github.io/learn_ruby_oneliners/one-liner-introduction.html
« Poslední změna: 28. 04. 2023, 20:08:17 od Vietnamka »


Re:find do dvou souborů
« Odpověď #20 kdy: 29. 04. 2023, 10:59:58 »
Tak už jsem si povídal s tím chatGPT botem. Dotaz na procesní substituci jak najít soubory se stejným jménem a stejným typem ze dvou složek:

Když to odešlu zdá se že čeká na vstup. Proto jsem zmáčkl ctrl+C, aby se to ukončilo. Zde je kopie výstupu:
Kód: [Vybrat]
comm -12 <(find /bin -type f -printf '%f\n' | sort) <(find /usr/bin -type f -printf '%f\n' | sort) <(find /sbin -type f -printf '%f\n' | sort
> ^C

ChatGPT

Zdá se, že ve vašem případě příkaz comm nevrátil žádný výstup a čekal na další vstup. To může být způsobeno tím, že vstupní soubory neobsahují žádná společná jména souborů. Pokud tedy chcete najít společné soubory, měli byste v příkazu použít složky, ve kterých se soubory nacházejí, které mají společné soubory. Tedy například
Kód: [Vybrat]
comm -12 <(ls /bin | sort) <(ls /usr/bin | sort).

k3dAR

  • *****
  • 2 988
  • porad nemam telo, ale uz mam hlavu... nobody
    • Zobrazit profil
    • E-mail
Re:find do dvou souborů
« Odpověď #21 kdy: 29. 04. 2023, 19:17:38 »
1. ceka na vstup protoze posledni substituci si neuzavrel zavorku
2. "find /bin -type f" bude mit prazdnej vystup protoze /bin je symlink => muzes pouzit "find /bin/ -type f" pak to hleda az od-uvnitr adresare /bin
3. pak to zarve protoze porovnavas 3 vstupy a muzes jen 2