Zobrazují se příspěvky se štítkembash. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkembash. Zobrazit všechny příspěvky

sobota 13. prosince 2025

Přesměrování audia do virtuálního sinku a vytvoření sinku

 

pactl load-module module-null-sink sink_name=MySink sink_properties=device.description=MySink

Tím vznikne MySink + zdroj MySink.monitor (ten použiješ jako záznamový zdroj v Audacity).

 

 

$ pactl load-module module-null-sink sink_name=MySink sink_properties=device.description=MySink
536870913
user@Toshi:~$ pactl list short sinks
pactl list short sources
64786    alsa_output.pci-0000_00_1b.0.pro-output-0    PipeWire    s32le 2 ch 48000 Hz    SUSPENDED
64787    alsa_output.pci-0000_00_1b.0.pro-output-3    PipeWire    s32le 8 ch 48000 Hz    SUSPENDED
65030    MySink    PipeWire    float32le 2 ch 48000 Hz    SUSPENDED
64786    alsa_output.pci-0000_00_1b.0.pro-output-0.monitor    PipeWire    s32le 2 ch 48000 Hz    SUSPENDED
64787    alsa_output.pci-0000_00_1b.0.pro-output-3.monitor    PipeWire    s32le 8 ch 48000 Hz    SUSPENDED
64788    alsa_input.pci-0000_00_1b.0.pro-input-0    PipeWire    s32le 2 ch 48000 Hz    RUNNING
65030    MySink.monitor    PipeWire    float32le 2 ch 48000 Hz    SUSPENDED
user@Toshi:~$
 

Aktivní sink inputs:

pactl list short sink-inputs

713    64786    712    PipeWire    s16le 1 ch 44100 Hz
 

ZRUŠENÍ ZAVEDENÉHO SINKU

pactl unload-module module-null-sink
pactl unload-module module-loopback

ZKUSÍM ZAVÉST VIRTUÁLNÍ ZDROJ

pactl load-module module-virtual-source source_name=MixSource source_properties=device.description=MixSource

$ pactl list short sources
66660    alsa_output.pci-0000_00_1b.0.pro-output-0.monitor    PipeWire    s32le 2 ch 48000 Hz    SUSPENDED
66661    alsa_output.pci-0000_00_1b.0.pro-output-3.monitor    PipeWire    s32le 8 ch 48000 Hz    SUSPENDED
66662    alsa_input.pci-0000_00_1b.0.pro-input-0    PipeWire    s32le 2 ch 48000 Hz    RUNNING
67689    output.MixSource    PipeWire    float32le 2 ch 48000 Hz    SUSPENDED
 


BASH SKRIPT PRO ZAVEDENÍ SINKU - K NIČEMU, AUDACITY NEPRACUJE S VIRTUÁLNÍM SINKEM ALE SOURCEM

 

#!/usr/bin/env bash
# Komfortní skript pro vytvoření "MySink" (null sink) + loopbacku
# Pro Linux Mint 21.3 (PulseAudio on PipeWire kompatibilita přes pactl)
# - start  : vytvoří null sink a loopback (idempotentní)
# - stop   : odstraní moduly načtené tímto skriptem
# - status : zobrazí stav (pactl list short ...)
# - install-autostart / remove-autostart : vytvoří/odstraní .desktop pro spouštění při přihlášení
#
# Poznámky:
# - Skript pracuje v uživatelském sezení (NESPUSŤTE SUDO!).
# - Výchozí fyzický sink je nastaven podle dat, které jsi poslal:
#   alsa_output.pci-0000_00_1b.0.pro-output-0
#   Pokud máš jiný, nastav proměnnou PHYSICAL_SINK před spuštěním nebo uprav v souboru.
# - Moduly načtené skriptem ukládá do ~/.config/mysink/modules.ids
#
set -euo pipefail

CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/mysink"
MODULES_FILE="$CONFIG_DIR/modules.ids"
SCRIPT_PATH="$(realpath "$0")"

NULL_SINK_NAME="MySink"
PHYSICAL_SINK="${PHYSICAL_SINK:-alsa_output.pci-0000_00_1b.0.pro-output-0}"
LATENCY_MS="50"
AUTOSTART_DESKTOP="$HOME/.config/autostart/mysink-start.desktop"

mkdir -p "$CONFIG_DIR"

function ensure_pactl() {
  if ! command -v pactl >/dev/null 2>&1; then
    echo "Chyba: pactl nenalezen. Nainstaluj Pulse/pipewire-pulse nebo zkontroluj PATH." >&2
    exit 1
  fi
}

function save_module_id() {
  local key="$1" id="$2"
  mkdir -p "$(dirname "$MODULES_FILE")"
  # replace key if exists
  if grep -q "^${key}=" "$MODULES_FILE" 2>/dev/null; then
    sed -i "s/^${key}=.*/${key}=${id}/" "$MODULES_FILE"
  else
    echo "${key}=${id}" >> "$MODULES_FILE"
  fi
}

function get_saved_module_id() {
  local key="$1"
  if [ -f "$MODULES_FILE" ]; then
    awk -F= -v k="$key" '$1==k{print $2}' "$MODULES_FILE" || true
  fi
}

function start() {
  ensure_pactl

  # 1) vytvořit null sink pokud neexistuje
  if pactl list short sinks | awk '{print $2}' | grep -xq "$NULL_SINK_NAME"; then
    echo "Null sink '$NULL_SINK_NAME' již existuje."
  else
    echo "Vytvářím null sink '$NULL_SINK_NAME'..."
    module_id=$(pactl load-module module-null-sink sink_name="$NULL_SINK_NAME" sink_properties=device.description="$NULL_SINK_NAME")
    echo "Načten modul module-null-sink id=$module_id"
    save_module_id NULL "$module_id"
  fi

  # 2) vytvořit loopback (MySink.monitor -> PHYSICAL_SINK) pokud neexistuje
  # zkusíme najít existující loopback s odpovídajícími parametry
  existing_loopback_id=$(pactl list short modules | awk '$2=="module-loopback"{print $1" "$0}' | grep "source=${NULL_SINK_NAME}.monitor" | grep "sink=${PHYSICAL_SINK}" | awk '{print $1}' || true)
  if [ -n "$existing_loopback_id" ]; then
    echo "Loopback již existuje (module id=$existing_loopback_id)."
    save_module_id LOOPBACK "$existing_loopback_id"
  else
    echo "Vytvářím loopback z ${NULL_SINK_NAME}.monitor do ${PHYSICAL_SINK}..."
    loop_id=$(pactl load-module module-loopback source=${NULL_SINK_NAME}.monitor sink=${PHYSICAL_SINK} latency_msec=${LATENCY_MS})
    echo "Načten modul module-loopback id=$loop_id"
    save_module_id LOOPBACK "$loop_id"
  fi

  echo
  echo "Hotovo. Stav (krátký přehled):"
  pactl list short sinks
  pactl list short sources
  pactl list short sink-inputs
  pactl list short modules | grep -E "module-null-sink|module-loopback" || true
  echo
  echo "Pokud chceš nahrávat v Audacity, vyber jako záznamový zdroj: Monitor of ${NULL_SINK_NAME}."
}

function stop() {
  ensure_pactl
  local loop_id saved_null saved_loop
  saved_loop=$(get_saved_module_id LOOPBACK || true)
  saved_null=$(get_saved_module_id NULL || true)

  if [ -n "$saved_loop" ]; then
    echo "Odstraňuji loopback (module id=$saved_loop)..."
    pactl unload-module "$saved_loop" || echo "Nepodařilo se unload-module $saved_loop" >&2
    sed -i "/^LOOPBACK=/d" "$MODULES_FILE" 2>/dev/null || true
  else
    echo "Loopback nebyl nalezen v uložených modulech. Hledám v běžících modulech..."
    # pokusit se najít a unload
    found=$(pactl list short modules | awk '$2=="module-loopback"{print $1" "$0}' | grep "source=${NULL_SINK_NAME}.monitor" | grep "sink=${PHYSICAL_SINK}" | awk '{print $1}' || true)
    if [ -n "$found" ]; then
      echo "Odstraňuji loopback module id=$found"
      pactl unload-module "$found" || true
    else
      echo "Loopback nenalezen."
    fi
  fi

  if [ -n "$saved_null" ]; then
    echo "Odstraňuji null sink (module id=$saved_null)..."
    pactl unload-module "$saved_null" || echo "Nepodařilo se unload-module $saved_null" >&2
    sed -i "/^NULL=/d" "$MODULES_FILE" 2>/dev/null || true
  else
    echo "Null sink nebyl nalezen v uložených modulech. Hledám v běžících modulech..."
    found_null=$(pactl list short modules | awk '$2=="module-null-sink"{print $1" "$0}' | grep "sink_name=${NULL_SINK_NAME}" | awk '{print $1}' || true)
    if [ -n "$found_null" ]; then
      echo "Odstraňuji module id=$found_null"
      pactl unload-module "$found_null" || true
    else
      echo "Null sink nenalezen."
    fi
  fi

  echo "Hotovo."
}

function status() {
  ensure_pactl
  echo "=== pactl info ==="
  pactl info
  echo
  echo "=== sinks ==="
  pactl list short sinks
  echo
  echo "=== sources ==="
  pactl list short sources
  echo
  echo "=== sink-inputs ==="
  pactl list short sink-inputs
  echo
  echo "=== modules (null-sink / loopback) ==="
  pactl list short modules | grep -E "module-null-sink|module-loopback" || true
  echo
  echo "Uložené module ids (pokud existují):"
  [ -f "$MODULES_FILE" ] && cat "$MODULES_FILE" || echo "(žádné)"
}

function install_autostart() {
  mkdir -p "$(dirname "$AUTOSTART_DESKTOP")"
  cat > "$AUTOSTART_DESKTOP" <<EOF
[Desktop Entry]
Type=Application
Name=MySink autostart
Exec=${SCRIPT_PATH} start
X-GNOME-Autostart-enabled=true
NoDisplay=false
Comment=Vytvori MySink a loopback pri prihlaseni
Terminal=false
EOF
  echo "Vytvořen: $AUTOSTART_DESKTOP"
}

function remove_autostart() {
  if [ -f "$AUTOSTART_DESKTOP" ]; then
    rm -f "$AUTOSTART_DESKTOP"
    echo "Odstraněn: $AUTOSTART_DESKTOP"
  else
    echo "Autostart soubor neexistuje: $AUTOSTART_DESKTOP"
  fi
}

function help() {
  cat <<EOF
Pouziti: $0 {start|stop|status|install-autostart|remove-autostart|help}

Př.: $0 start            # vytvoří MySink + loopback
     $0 stop             # odstraní moduly vytvořené tímto skriptem
     $0 status           # zobrazí stav pactl
     $0 install-autostart # spustí při přihlášení
     $0 remove-autostart  # smaže autostart

Proměnné prostředí:
  PHYSICAL_SINK     - jméno fyzického sinku (default: $PHYSICAL_SINK)
  NULL_SINK_NAME    - název virtuálního sinku (default: $NULL_SINK_NAME)
  LATENCY_MS        - latence pro loopback (ms)

Poznámka: Spouštěj bez sudo (v uživatelském sezení). Pokud používáš jiný fyzický sink,
        nastav PHYSICAL_SINK před spuštěním nebo uprav řetězec v souboru.
EOF
}

# main
if [ $# -lt 1 ]; then
  help
  exit 0
fi

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status
    ;;
  install-autostart)
    install_autostart
    ;;
  remove-autostart)
    remove_autostart
    ;;
  help|--help|-h)
    help
    ;;
  *)
    echo "Neznama volba: $1" >&2
    help
    exit 2
    ;;
esac
 

 

úterý 9. září 2025

Jak zamaskovat láhev s alkoholem (hanácká) ve videu? ffmpeg

První pokus s jednou oblastí:

ffmpeg -i frame_10s.png -filter_complex "[0:v]crop=30:57:110:225[left];[0:v][left]overlay=140:225[out]" -map "[out]" frame_masked.png
 

Ted dvě oblasti zamaskují modrý kovový vršek a modrou nálepku (tj. dvě oblasti):

ffmpeg -i frame_10s.png -filter_complex "
[0:v]crop=34:61:104:223[c1];
[0:v]crop=60:104:72:330[c2];
[0:v][c1]overlay=138:223[tmp];
[tmp][c2]overlay=132:330[out]
" -map "[out]" frame_masked.png

 

Nakonec chci hlavně udělat framu doprava, přímo ve videu, a následně to maskování framu.

ffmpeg -i "donio cuts horizontal.mp4" -filter_complex "
[0:v]transpose=1,split=3[base][c1src][c2src];
[c1src]crop=34:61:104:223[c1];
[c2src]crop=60:104:72:330[c2];
[base][c1]overlay=138:223[tmp];
[tmp][c2]overlay=132:330[out]
" -map "[out]" -c:v libx264 -crf 18 -preset veryfast -c:a copy "donio cuts vertical.mp4"


FFmpeg – vysvětlení filtrů a labelů

1. Co jsou hranaté závorky [xxx]

V filter_complex FFmpeg používáš hranaté závorky pro označení vstupů a výstupů filtrů:

  • [0:v] — první vstupní soubor, video stream.
  • [0:a] — první vstupní soubor, audio stream.
  • [c1], [base], [tmp], [out] — libovolná pojmenování mezivýstupů.

Tyto "labely" se používají v řetězci filtrů nebo v -map, aby FFmpeg věděl, který výsledek má použít.

2. Rozklad příkazu

Příkaz, který jsme používali:

ffmpeg -i "donio cuts horizontal.mp4" -filter_complex "
[0:v]transpose=1,split=3[base][c1src][c2src];
[c1src]crop=34:61:104:223[c1];
[c2src]crop=60:104:72:330[c2];
[base][c1]overlay=138:223[tmp];
[tmp][c2]overlay=132:330[out]
" -map "[out]" -c:v libx264 -crf 18 -preset veryfast -c:a copy "donio cuts vertical.mp4"

a) Otočení + split

[0:v]transpose=1,split=3[base][c1src][c2src];

- transpose=1 otočí video o 90° CW.
- split=3 vytvoří tři větve: [base], [c1src], [c2src].

b) Crop výřezů (záplat)

[c1src]crop=34:61:104:223[c1];
[c2src]crop=60:104:72:330[c2];

- crop=šířka:výška:x:y vystřihne obdélník ze zdrojové větve.
- Výstupy jsou pojmenovány [c1] a [c2].

c) Overlay první oblasti

[base][c1]overlay=138:223[tmp];

Překryje základní video [base] záplatou [c1] na pozici x=138, y=223. Výsledek pojmenuje [tmp].

d) Overlay druhé oblasti

[tmp][c2]overlay=132:330[out]

Překryje mezivýsledek [tmp] druhou záplatou [c2] na pozici x=132, y=330. Konečný výsledek je [out].

e) Mapování

-map "[out]"

Říká FFmpeg, aby použil label [out] jako video výstup. Bez mapování by FFmpeg nevěděl, který mezivýsledek exportovat.

3. Shrnutí

  • Labely jsou libovolné názvy; místo [out] můžeš použít [final].
  • Split vytváří paralelní větve obrazu.
  • Overlay překrývá jeden obraz na druhý.
  • Cruicial order: filtry se musí logicky propojit, vstupy musí odpovídat výstupům předchozích filtrů.
  • Audio: -c:a copy kopíruje zvuk beze změny.
  • Kvalita: -crf 18 -preset veryfast pro dobrou kvalitu a rychlost.

4. Test na obrázku

ffmpeg -i frame_10s.png -filter_complex "
[0:v]crop=34:61:104:223[c1];
[0:v]crop=60:104:72:330[c2];
[0:v][c1]overlay=138:223[tmp];
[tmp][c2]overlay=132:330[out]
" -map "[out]" frame_masked.png
* * * 
PŘIDÁNÍ AUDIA DO VÝSTUPU
ffmpeg -i "donio cuts horizontal.mp4" -filter_complex "
[0:v]transpose=1,split=3[base][c1src][c2src];
[c1src]crop=34:61:104:223[c1];
[c2src]crop=60:104:72:330[c2];
[base][c1]overlay=138:223[tmp];
[tmp][c2]overlay=132:330[out]
" -map "[out]" -map 0:a -c:v libx264 -crf 18 -preset veryfast -c:a copy "donio cuts vertical.mp4"
 
Funguje opravdu skvěle. 

úterý 15. července 2025

grep v základním režimu reg. expr. (BRE) nepoužívá kvantifikátor +

Otázka se týká problému s regulárním výrazem (regexem) v Pythonu a případně v příkazu grep, kde hledáte slovo „ženu“ pomocí vzorce ^[a-zščťž][aeiouyáéíóúýůě]+nu/.*, ale tento vzorec nenachází očekávaný výsledek „ženu/BN“, přestože by podle vás měl fungovat díky přítomnosti znaku +. Pojďme si to podrobně rozebrat a vysvětlit, v čem je problém a jak ho vyřešit.

Rozbor problému

Nejprve si rozložíme váš regex ^[a-zščťž][aeiouyáéíóúýůě]+nu/.* na jednotlivé části, abychom pochopili, co přesně hledá:

  • ^: Začátek řetězce.
  • [a-zščťž]: Jeden znak z této množiny, což zahrnuje malá písmena a-z a české znaky š, č, ť, ž. Tedy například ž zde sedí.
  • [aeiouyáéíóúýůě]+: Jeden nebo více samohlásek z této množiny (včetně českých samohlásek jako á, é, ů, ě). Znak + znamená „alespoň jedna“.
  • nu/: Přesná posloupnost znaků n, u, /.
  • .*: Nula nebo více libovolných znaků až do konce řetězce.

Pro slovo „ženu/BN“ by to mělo fungovat takto:

  • ^: Začátek řetězce – ano.
  • [a-zščťž]: ž – ano, je v této množině.
  • [aeiouyáéíóúýůě]+: e – ano, je to samohláska, a + vyžaduje alespoň jednu, takže to sedí.
  • nu/: Následuje n, u, / – ano, přesně odpovídá.
  • .*: Zbývá BN – ano, odpovídá libovolným znakům.

Teoreticky by tedy regex ^[a-zščťž][aeiouyáéíóúýůě]+nu/.* měl slovo „ženu/BN“ najít, protože splňuje všechny podmínky: začíná písmenem ž, má jednu samohlásku e (což stačí pro +), a pak následuje nu/ a zbytek.

Proč to nefunguje?

Ve vaší otázce uvádíte dva příkazy:

  1. cat cs_CZ.dic | grep "^[a-zščťž][aeiouyáéíóúýůě]*nu/.*" | ...
    • Tento příkaz najde „ženu/BN“ (společně s dalšími, např. „tnu/BN“, „žnu/BN“).
  2. cat cs_CZ.dic | grep "^[a-zščťž][aeiouyáéíóúýůě]+nu/.*" | ...
    • Tento příkaz „ženu/BN“ nenajde.

Rozdíl je mezi * (nula nebo více) a + (jedna nebo více). Ale protože „ženu/BN“ má jednu samohlásku e, měl by fungovat i regex s +. Proč tedy nefunguje?

Klíčový důvod: grep a základní regulární výrazy (BRE)

Problém spočívá v tom, že příkaz grep bez přepínače -E používá základní regulární výrazy (Basic Regular Expressions, BRE), nikoli rozšířené regulární výrazy (Extended Regular Expressions, ERE). V BRE má znak + jinou funkci:

  • V BRE není + kvantifikátor („jedna nebo více“), ale je považován za literál, tedy hledá skutečný znak + v textu.
  • V ERE (povolené pomocí grep -E) je + kvantifikátor, jak očekáváte.

Takže váš druhý regex ^[a-zščťž][aeiouyáéíóúýůě]+nu/.* v grep bez -E hledá:

  • Začátek řetězce.
  • Jeden znak z [a-zščťž].
  • Jeden znak z [aeiouyáéíóúýůě].
  • Literál + (který v „ženu/BN“ není).
  • Pak nu/ a cokoli dalšího.

Protože v „ženu/BN“ není znak + mezi e a nu/, regex neodpovídá a nic nenajde.

Naopak první regex s * funguje, protože v BRE je * kvantifikátor („nula nebo více“) a správně interpretuje [aeiouyáéíóúýůě]* jako nula nebo více samohlásek, což „ženu/BN“ splňuje.

Řešení pro grep

Aby váš druhý regex fungoval podle očekávání (hledal alespoň jednu samohlásku), musíte použít grep -E, který povolí rozšířené regulární výrazy. Upravte příkaz takto:

cat cs_CZ.dic | grep -E "^[a-zščťž][aeiouyáéíóúýůě]+nu/.*" | grep -vE "/HRIN|/FI|/PI|/[HRPQEFLW]+$" | grep -vE "^(pro|na|do|u|roze?|přede|př[ei]|po|za|vy|ode?|obe?|znovu|spolu)"

Tento příkaz správně rozpozná + jako „jedna nebo více samohlásek“ a najde „ženu/BN“, protože e je přítomna.

A co Python?

Ve vaší otázce zmiňujete „regex v Pythonu 3“. V Pythonu modul re používá rozšířené regulární výrazy implicitně, takže + je vždy kvantifikátor. Pokud tedy používáte tento kód:

import re

text = "ženu/BN"
pattern = r"^[a-zščťž][aeiouyáéíóúýůě]+nu/.*"
if re.match(pattern, text):
    print("Našlo to!")
else:
    print("Nenašlo to.")

Výstup bude „Našlo to!“, protože regex funguje správně a „ženu/BN“ odpovídá vzorci.

Pokud vám to v Pythonu nefunguje, mohl by být problém v:

  • Kódování: Ujistěte se, že váš soubor/skript je v UTF-8, aby české znaky (ž, ě) byly správně rozpoznány.
  • Textu: Ověřte, že testovaný řetězec je skutečně „ženu/BN“ bez skrytých znaků (např. mezery, konce řádků).

Ověření a doporučení

  1. Pro grep: Použijte grep -E, jak je uvedeno výše.
  2. Pro Python: Regex by měl fungovat, pokud je text správně formátovaný. Můžete vyzkoušet:
    import re
    with open("cs_CZ.dic", encoding="utf-8") as f:
        for line in f:
            if re.match(r"^[a-zščťž][aeiouyáéíóúýůě]+nu/.*", line.strip()):
                print(line.strip())
    
  3. Kontrola souboru: Zkontrolujte obsah cs_CZ.dic příkazem cat -A cs_CZ.dic, zda neobsahuje skryté znaky.

Závěr

Důvod, proč druhý regex ^[a-zščťž][aeiouyáéíóúýůě]+nu/.* neextrahuje „ženu/BN“ v příkazu grep, je ten, že bez -E je + považován za literál, nikoli kvantifikátor. Po odstranění + nebo nahrazení * to funguje, protože * je v BRE správně interpretováno. Použitím grep -E zajistíte, že + bude znamenat „jedna nebo více“, jak očekáváte.

Doufám, že toto vysvětlení vyřeší vaši záhadu! Pokud máte další otázky, neváhejte se ozvat.

středa 25. prosince 2024

GPT: Ramdisk a extrakce .deb

 

Následující skript provádí popsané kroky, využívá RAMdisky různých velikostí podle potřeby a provádí extrakci. Tento skript je psán v Bash a je možné jej přizpůsobit podle konkrétních požadavků.

Bash skript: RAMdisk pro extrakci souboru z .deb

#!/bin/bash

# Cesty pro RAMdisky
RAMDISK_100M="/mnt/ram_tar_100M"
RAMDISK_300M="/mnt/ram_tar_300M"
RAMDISK_1000M="/mnt/ram_tar_1000M"
CILOVY_ADRESAR="/cilovy/adresar"  # Cílový adresář pro extrakci souboru
RAMDISK_PRIPRAVEN=""  # Sledování, jaký RAMdisk je aktuálně připojen

# Funkce pro kontrolu a vytvoření RAMdisku
function nastav_ramdisk {
    local ramdisk_path=$1
    local ramdisk_size=$2

    # Pokud složka neexistuje, vytvořte ji
    if [ ! -d "$ramdisk_path" ]; then
        sudo mkdir -p "$ramdisk_path"
    fi

    # Zkontrolujeme, zda je RAMdisk připojen
    local disk_size=$(du "$ramdisk_path" | awk '{print $1}')
    if [ "$disk_size" -eq 4 ]; then
        sudo mount -t tmpfs -o size="$ramdisk_size"M tmpfs "$ramdisk_path"
        RAMDISK_PRIPRAVEN="$ramdisk_path"
        echo "RAMdisk o velikosti $ramdisk_size MB připojen na $ramdisk_path"
    fi
}

# Funkce pro odpojení RAMdisku
function odpoj_ramdisk {
    local ramdisk_path=$1
    if mount | grep -q "$ramdisk_path"; then
        sudo umount "$ramdisk_path"
        echo "RAMdisk $ramdisk_path odpojen."
    fi
}

# Hlavní logika
function extrahuj_z_deb {
    local deb_soubor=$1

    # Zjistěte velikost .deb souboru
    local velikost_deb=$(du -m "$deb_soubor" | awk '{print $1}')

    # Nastav RAMdisk podle velikosti .deb souboru
    if [ "$velikost_deb" -le 33 ]; then
        nastav_ramdisk "$RAMDISK_100M" 100
    elif [ "$velikost_deb" -le 100 ]; then
        nastav_ramdisk "$RAMDISK_300M" 300
    else
        nastav_ramdisk "$RAMDISK_1000M" 1000
    fi

    if [ -z "$RAMDISK_PRIPRAVEN" ]; then
        echo "Chyba: Nepodařilo se připojit RAMdisk."
        exit 1
    fi

    # Přesuňte .deb na RAMdisk
    cp "$deb_soubor" "$RAMDISK_PRIPRAVEN/"
    cd "$RAMDISK_PRIPRAVEN" || exit

    # Rozbalte .deb
    ar x "$(basename "$deb_soubor")"
    if [ $? -ne 0 ]; then
        echo "Chyba při rozbalení .deb souboru."
        return 1
    fi

    # Extrahujte požadovaný soubor z data.tar.*
    tar -xf data.tar.* -C "$CILOVY_ADRESAR" ./cesta/k/pozadovanemu_souboru
    if [ $? -eq 0 ]; then
        echo "Extrakce souboru z archivu byla úspěšná."
    else
        echo "Chyba při extrakci souboru z archivu."
        return 1
    fi

    # Smažte soubory na RAMdisku
    rm -rf "$RAMDISK_PRIPRAVEN"/*
    echo "RAMdisk vyčištěn."

    # Odpojte RAMdisk, pokud velikost byla větší než 100 MB
    if [ "$RAMDISK_PRIPRAVEN" != "$RAMDISK_100M" ]; then
        odpoj_ramdisk "$RAMDISK_PRIPRAVEN"
    fi

    # Reset proměnné RAMDISK_PRIPRAVEN
    RAMDISK_PRIPRAVEN=""
}

# Ukázka použití
deb_soubor="/cesta/k/souboru.deb"
extrahuj_z_deb "$deb_soubor"

Vysvětlení:

  1. Funkce nastav_ramdisk: Zajistí připojení RAMdisku podle požadované velikosti.
  2. Funkce odpoj_ramdisk: Bezpečně odpojí RAMdisk, pokud byl použit.
  3. Hlavní logika: Vybere vhodný RAMdisk podle velikosti .deb souboru, extrahuje požadovaný soubor a na konci RAMdisk vyčistí nebo odpojí.
  4. Efektivita: Minimalizuje zápisy na disk a využívá RAMdisk pouze podle potřeby.

Tento skript pokrývá většinu požadovaných kroků a je snadno rozšiřitelný. Stačí nahradit ./cesta/k/pozadovanemu_souboru skutečnou cestou požadovaného souboru a nastavit CILOVY_ADRESAR.

pondělí 16. prosince 2024

Skript k odstranění PulseAudio a pro instalaci PipeWire

 

 

# apt install alsamixer
# apt install alsa-utils
# ODINSTALOVAT pulseaudio pokud přítomný
apt remove pulseaudio gnome-bluetooth
apt install pipewire-pulse wireplumber  pavucontrol
dpkg -l pulse*
apt autoremove

add-apt-repository ppa:pipewire-debian/pipewire-upstream
apt update
apt install -y pipewire pipewire-audio-client-libraries


apt install -y gstreamer1.0-pipewire libpipewire-0.3-{0,dev,modules} libspa-0.2-{bluetooth,dev,jack,modules} pipewire{,-{audio-client-libraries,pulse,media-session,bin,locales,tests}}

systemctl --user --now disable pulseaudio.service pulseaudio.socket
systemctl --user --now enable pipewire pipewire-pulse
pactl info
 

 

Skript vypadá robustně a provádí několik zásadních kroků k instalaci PipeWire a odstranění PulseAudio. Pokud plánujete tento skript použít na současný systém (aby odpovídal připojenému systému), postup bude následující:


1. Kontrola aktuálního stavu

Nejdříve zkontrolujte, zda PulseAudio běží a zda jsou některé PipeWire balíky přítomné.
Kontrola PulseAudio:


 

 

neděle 8. prosince 2024

Vytvoření skupiny, přidání uživatele do skupiny a konfigurace Samby

Vytvoření skupiny linlan a přidání uživatele do skupiny

$ sudo groupadd linlan
$ sudo usermod -aG linlan user

Přidat uživatele samby a nastavit mu heslo:

$ sudo smbpasswd -a user

Nejprve zadám heslo sudo a pak jsem vyzván k tomu, abych zadal heslo do Samby pro uživatele user. Potvrdím a pak ho zadám ještě jednou pro kontrolu.

Složce nastavíme práva

sudo chown -R :linlan /cesta/k/sdilene/slozce sudo chmod -R 770 /cesta/k/sdilene/slozce

Globální konfigurace samby

 [global]
bind interfaces only = yes
interfaces = lo enp14s0 192.168.1.101
workgroup = WORKGROUP
server role = standalone
log file = /var/log/samba/%m.log
max log size = 50

Tento blok konfigurace Samby obsahuje důležitá nastavení pro správu síťového připojení, síťové skupiny (workgroup) a protokolování (logování). Pojďme si ho podrobně rozebrat:


Rozbor konfigurace

[global]
bind interfaces only = yes
interfaces = lo enp14s0 192.168.1.101
workgroup = Workgroup
server role = standalone
log file = /var/log/samba/%m.log
max log size = 50

1. bind interfaces only = yes

  • Určuje, že Samba bude naslouchat pouze na definovaných rozhraních v parametru interfaces.
  • To je důležité pro bezpečnost, protože Samba nebude dostupná na všech rozhraních.

2. interfaces = lo enp14s0 192.168.1.101

  • Specifikuje síťová rozhraní nebo IP adresy, na kterých má Samba naslouchat.
    • lo je loopback rozhraní (localhost, 127.0.0.1).
    • enp14s0 je síťové rozhraní vašeho zařízení.
    • 192.168.1.101 je IP adresa zařízení (notebooku), na které Samba naslouchá.
    Pokud přidáte špatné nebo neexistující rozhraní/adresu, Samba nebude správně fungovat.
  • VM ale má lo ens33 192.168.200.128 proto samba na notebooku musí mít nastaveno:

[global]
bind interfaces only = yes
interfaces =
ens33  
# viz ifconfig -a
workgroup = workgroup 
# Použijte malá písmena
server role = standalone
log file = /var/log/samba/%m.log
max log size = 50

 

3. workgroup = WORKGROUP

  • Definuje síťovou pracovní skupinu, do které Samba patří.
  • WORKGROUP je výchozí hodnota používaná ve Windows sítích. Všechna zařízení, která chtějí spolupracovat, musí mít stejnou hodnotu.

4. server role = standalone

  • Určuje roli Samba serveru:
    • standalone: Server funguje samostatně, ne jako člen domény.
    • To je vhodné pro domácí sítě nebo malé kanceláře.

Llama k tomu píše

/etc/samba/smb.conf

Také místo @linlan by mělo být @linlan nahrazeno skupinou, která existuje na vašem systému, nebo můžete použít konkrétní uživatele.

Pokud chcete přistupovat do windowské sítě Workgroup, budete muset přidat sekci [global] do svého /etc/samba/smb.conf souboru a nastavit následující parametry:


[global]
  workgroup = WORKGROUP
  netbios name = jméno_vašeho_počítače
  security = user


Také budete muset přidat sekci [filmy] s parametry, které jste již uvedli:


[filmy]
  path = /home/user/mnt/filmy
  valid users = @linlan
  create mask = 0660
  directory mask = 0770


Po úpravě /etc/samba/smb.conf souboru nezapomeňte restartovat službu Samba, aby se změny projevily.

5. log file = /var/log/samba/%m.log

  • Určuje umístění logů Samby. Proměnná %m se nahrazuje názvem klienta (např. jménem počítače, který se připojuje).
  • Každý klient má tak svůj vlastní log soubor.

6. max log size = 50

  • Určuje maximální velikost log souborů (v KB).
  • Pokud log dosáhne této velikosti, Samba ho přestane rozšiřovat, aby nezabírala příliš mnoho prostoru.

Souvisí s nastavením sdílené složky?

Ano i ne:

  • Souvisí:
    • Parametry bind interfaces a interfaces zajišťují, že Samba je dostupná pouze na konkrétních IP adresách/rozhraních. Pokud je špatně nastavíte, Samba nemusí být dostupná na očekávané síti.
    • Workgroup musí odpovídat skupině ostatních zařízení v síti (např. pokud Windows PC má WORKGROUP, musí ji mít i Samba).
  • Nesouvisí přímo:
    • Parametry sdílení složek (např. path, valid users, read only) se nastavují v konkrétní sekci, jako je [sdilena_slozka].

Oprava a doporučení

  1. Aktualizace interfaces: Pokud víte, že vaše síťová karta je enp14s0 a Samba má být dostupná na IP adrese 192.168.1.101, pak je nastavení správné.

  2. Kontrola workgroup: Ujistěte se, že všechna zařízení (Windows i Linux) mají stejnou hodnotu workgroup.

  3. Logování: Zkontrolujte logy Samby, pokud máte problémy s připojením:

    sudo tail -f /var/log/samba/*.log
    

Pokud něco nefunguje, dejte vědět! 😊

 

 

 

Masky v Sambě

V konfiguraci Samby se parametry create mask a directory mask používají k nastavení oprávnění pro nové soubory a adresáře, které jsou vytvořeny přes Sambové sdílení. Umožňují kontrolovat, kdo může číst, zapisovat nebo provádět soubory a jaká oprávnění budou mít nově vytvořené adresáře.

Co znamenají masky?

  1. create mask:

    • Určuje oprávnění pro nové soubory vytvořené ve sdílené složce.
    • V Sambě jsou oprávnění nastavována v oktalovém formátu (stejně jako v Linuxu pomocí příkazu chmod).
    • Příklad:
      • Hodnota 0660 znamená:
        • Uživatel: čtení a zápis.
        • Skupina: čtení a zápis.
        • Ostatní: žádná oprávnění.
  2. directory mask:

    • Určuje oprávnění pro nové adresáře vytvořené ve sdílené složce.
    • Adresáře obvykle potřebují mít povolené procházení (bit x), aby je uživatelé mohli otevřít.
    • Příklad:
      • Hodnota 0770 znamená:
        • Uživatel: čtení, zápis a procházení.
        • Skupina: čtení, zápis a procházení.
        • Ostatní: žádná oprávnění.

Sdílení složek v sambě

Každá sdílená složka v Sambě musí být uvedena pod vlastní sekcí v konfiguraci (např. [zálohy_01], [zálohy_02]) s individuálním nastavením, včetně parametru path. Samba neumožňuje specifikovat více adresářů pro sdílení v rámci jedné sekce.

Důvody:

  1. Jednoznačné přiřazení nastavení: Každá sekce obsahuje individuální konfiguraci (jako oprávnění, masky, přístup uživatelů), která se vztahuje pouze na adresář uvedený v path.
  2. Struktura konfigurace: Samba je navržena tak, aby jedno path odpovídalo jednomu sdílení. Pokus o uvedení více cest v rámci jedné sekce by byl ignorován nebo vedl k chybám.

Nakonfigurujte sdílenou složku v /etc/samba/smb.conf:

[sdilena_slozka] path = /cesta/k/sdilene/slozce valid users = @linlan read only = no create mask = 0660 directory mask = 0770

Restartujte službu Samba:

sudo systemctl restart smbd

Uživatel user se nyní může přihlásit na sdílenou složku pomocí svého Sambového hesla.

Bash script

Bash skript na nasdílení mnoha složek v kořenovém adresáři (třeba na Windows) by mohl mít na začátku volbu zda chci potvrzovat z výpisu kořebnového adresáře... takže např. po zavolání ./sambadirs.sh /media/filmy by vyskočila volba zda chci potvrzovat složky jedotlivě zda je zahrnout do seznamu nebo se přidají všechny do té cesty

#!/bin/bash

# Ověří, zda byl zadán vstupní adresář
if [ -z "$1" ]; then
  echo "Použití: $0 "
  exit 1
fi

# Zadaný kořenový adresář
ROOT_DIR=$1

# Výstupní soubor pro sdílenou konfiguraci
SAMBA_CONF="/tmp/samba_shares.conf"

# Volba potvrzování
read -p "Chcete potvrdit přidání jednotlivých složek? [y/n] " CONFIRM

# Inicializace výstupního souboru
echo "; Automaticky generovaná Samba konfigurace" > "$SAMBA_CONF"

# Prochází všechny podadresáře
for DIR in "$ROOT_DIR"/*; do
  if [ -d "$DIR" ]; then
    if [ "$CONFIRM" == "y" ]; then
      read -p "Přidat adresář $DIR? [y/n] " ADD
      if [ "$ADD" != "y" ]; then
        continue
      fi
    fi

    # Název sdílené složky (bez cesty)
    SHARE_NAME=$(basename "$DIR")

    # Přidá do konfigurace
    echo "[$SHARE_NAME]" >> "$SAMBA_CONF"
    echo "path = $DIR" >> "$SAMBA_CONF"
    echo "read only = no" >> "$SAMBA_CONF"
    echo "create mask = 0660" >> "$SAMBA_CONF"
    echo "directory mask = 0770" >> "$SAMBA_CONF"
    echo "valid users = @linlan" >> "$SAMBA_CONF"
    echo "" >> "$SAMBA_CONF"
  fi
done

# Výstup
echo "Konfigurace byla uložena do $SAMBA_CONF"
echo "Pro přidání do Samby zkopírujte obsah do /etc/samba/smb.conf"

Nastavení práv, spuštění a přidání do konfigurace samby

chmod +x sambadirs.sh
./sambadirs.sh /media/filmy 
sudo cat /tmp/samba_shares.conf >> /etc/samba/smb.conf 
sudo systemctl restart smbd
 

neděle 27. října 2024

Bash: Bash funkce remount na dočasné odpojení a připojení některých oddílů

# Funkce remount umožní na krátko odpojit zařízení disku
# Použití:
# remount sda 180 FILMY
# 180 - čas pro připojení disků sda, FILMY je text který tam musí být nalezen aspoň v jednom oddílu
declare -f remount
remount() {
    local device="/dev/$1"
    local remount_time="$2"
    local verify_value="$3" # Popis nebo label pro kontrolu jednoho oddílu
    local mount_points=()

    # Ověření existence oddílu obsahujícího verify_value
    if ! blkid | grep "$device" | grep -q "$verify_value"; then
        echo "Žádný oddíl na $device neobsahuje $verify_value. Proces byl ukončen."
        return 1
    fi

    echo "Byl nalezen oddíl obsahující $verify_value. Zahajuji odpojování všech oddílů na $device..."

    # Odpoutání všech oddílů zařízení
    while IFS= read -r line; do
        # Získejte název oddílu
        local partition=$(echo "$line" | awk '{print $1}' | sed 's|:||')
        # Získej aktuální přípojný bod ze stromu připojených zařízení
        local mount_point=$(findmnt -no TARGET "$partition")
        if [ -z "$mount_point" ]; then
            echo "Skipping $partition, probably not mounted."
        fi
        if [ -n "$mount_point" ]; then
            # Přidejte mount point do pole a odpojte oddíl
            mount_points+=("$mount_point")
            sudo umount -v "$partition"
            echo "Odpojeno: $partition z $mount_point"
        fi
    done < <(blkid | grep "$device")

    # Vyčkejte na remount
    sleep "$remount_time"

    echo "Čas vypršel, připojuji zpět oddíly..."

    # Připojte zpět oddíly na jejich původní mount pointy
    for mount_point in "${mount_points[@]}"; do
        sudo mount "$mount_point"
        echo "Připojeno zpět: $mount_point"
    done
}

středa 21. srpna 2024

Funkce pro výpis aplikací a konfiguráků na Mintu (III. fáze vývoje)

 

Pozor! Je nutné důkladně překontrolovat jestli ChatGPT 4o něco neodstranil z původní verze vývoje II. fáze. Musel jsem ho dvakrát opravovat, protože nejprve úplně zredukoval kód, vypustil řízení zpracování argumentů a funkci compare_apps ... a nehledal koncovky jako .xml, .conf apod. ale jen *název_aplikace* v adresářích.

Nakonec je ale přidáno hledání aplikací v systémových složkách - pozor! nevýhoda je, že pokud ta aplikace je už ve výpisu z Plocha/*.desktop tak se to tam objeví znovu. Ty soubory v bin tam bude spousta programů, které ani nepotřebuju znát, protože mě zajímají spíš balíčky než jednotlivé systémové programy... které jsou roztahány kdoví kde.

# Pro porovnávání mezi systémy musí být přítomno:
# --compare a --mounted_device nebo --external...

show-apps() {
    # Funkce pro načítání .desktop souborů a jejich zpracování
zpracování
#   22-08-2024 12h  Změna pořadí argumentů:
#    Funkci process_desktop_files bychom měli volat s tím, že první argument bude název proměnné (například apps_current_system), a další argumenty budou cesty.

# 22-08-2024 12h Úprava funkce process_desktop_files:
#    Zajistíme, že proměnná app_list_name správně odkazuje na název proměnné, do které se mají ukládat nalezené aplikace.

    process_desktop_files() {
        local app_list_name="$1"
        declare -n app_list="$app_list_name" # název proměnné je zadán v argumentu 1
        shift
        local search_paths=("$@")
        local new_paths=()
        local processed_paths=()

        for path in "${search_paths[@]}"; do
            # Expandovat ~ na domovský adresář
            expanded_path=$(eval echo "$path")

            # Pokud cesta byla již zpracována, přeskočte
            if [[ " ${processed_paths[*]} " == *" $expanded_path "* ]]; then
                continue
            fi

            processed_paths+=("$expanded_path")
            if [[ $compare_style -eq 0 ]]; then
               echo "Prohledávám: $expanded_path"
            fi

            # Vyhledání .desktop souborů v aktuální cestě
            desktop_files=$(find "$expanded_path" -type f -name "*.desktop" | sort )


            for file in $desktop_files; do
                # Zkontrolovat, zda soubor existuje
                if [[ -f "$file" ]]; then
                    if [[ $compare_style -eq 0 ]]; then
                    echo "Nalezen .desktop soubor: $file"
                    fi
                    name=$(grep -m 1 "^Name=" "$file" | cut -d '=' -f 2-)
name=$(grep -m 1 "^Name=" "$file" | cut -d '=' -f 2-)
                    # Kontrola, zda `name` obsahuje mezeru
                    if [[ "$name" == *" "* ]]; then
                        # Kontrola, zda `name` (ne)obsahuje uvozovku
                        if [[ "$name" != *"\""* ]]; then
                            # Pokud `name` obsahuje mezeru, ale neobsahuje uvozovku, zabalte do uvozovek
                            name="\"$name\""
                        fi
                    fi

                    # Zpracování Exec pro odstranění parametrů
                    raw_exec=$(grep -m 1 "^Exec=" "$file" | cut -d '=' -f 2-)
                    exec_path=$(echo "$raw_exec" | sed -e 's/^\"//' -e 's/\"$//' | awk '{print $1}')

                    icon=$(grep -m 1 "^Icon=" "$file" | cut -d '=' -f 2-)
                    categories=$(grep -m 1 "^Categories=" "$file" | cut -d '=' -f 2-)
                    # Filtrování kategorií pro zobrazení pouze KDE, GTK a XFCE
                    filtered_categories=$(echo "$categories" | grep -o -E '(KDE|GTK|XFCE)')


                    # Zvýraznění názvu aplikace světle zelenou barvou
                    if [[ $compare_style -eq 0 ]]; then
                            echo -e "  Název aplikace: \e[92m$name\e[0m"
                        # Kontrola, jestli Exec je cesta, skript, nebo název programu
                        if [[ "$exec_path" == /* ]]; then
                            if [[ "$exec_path" == *.sh ]]; then
                                echo "  Spustitelný skript: \e[93m$exec_path\e[0m"
                            else
                                echo "  Spustitelná cesta: $exec_path"
                            fi
                        else
                            # Zvýraznění spouštěcího příkazu žlutou barvou
                            echo -e "  Spouštění: \e[93m$exec_path\e[0m"
                        fi
                        echo "  Ikona: $icon"
                        echo "  Kategorie: $filtered_categories"
                    fi


                    # Pokud je exec_path skutečná cesta, přidáme ji do nových cest
                    if [[ "$exec_path" == /* && ! " ${processed_paths[*]} " == *" $exec_path "* ]]; then
                        if [ -d "$exec_path" ]; then
                            new_paths+=("$exec_path")
                        else
                            # Přidání aplikace do seznamu
                            app_list+=("$name")
                            exec_dir=$(dirname "$exec_path")
                            if [ -d "$exec_dir" ] && ! [[ " ${processed_paths[*]} " == *" $exec_dir "* ]]; then
                                new_paths+=("$exec_dir")
                            fi
                        fi
                    fi
                    if [[ $compare_style -eq 0 ]]; then
                        echo ""
                    fi
                else
                    if [[ $compare_style -eq 0 ]]; then
                         echo "Přeskočen soubor: $file (soubor neexistuje)"

                    fi
                fi
            done
        done

        # Pokud existují nové cesty, zpracujeme je rekurzivně
        if [ ${#new_paths[@]} -ne 0 ]; then
            process_desktop_files "$app_list_name" "${new_paths[@]}"
        fi
        # Odstranění duplicit až po zpracování všech cest
        remove_duplicates "$app_list_name"
    }

    remove_duplicates() {
        local app_list_name="$1"
        declare -n app_list="$app_list_name" # název proměnné je zadán v argumentu 1
        # Vytvořit nový seznam bez duplicit
        IFS=$'\n'
        local unique_apps=($(printf "%s\n" "${app_list[@]}" | sort -u))
        unset IFS

        # Uložit unikátní seznam do původní proměnné
        app_list=("${unique_apps[@]}")
    }

    # Funkce pro zjištění konfiguračních souborů aplikací
    process_config_files() {
        local app_name="$1"
        config_files=()
        config_files+=( $(find "$HOME/.config" -type f \( -name "*.conf" -o -name "*.ini" -o -name "*.xml" -o -name "*.cfg" -o -name "*.rc" \) 2>/dev/null | sort ) )

        config_files+=( $(find "$HOME/.local" -type f \( -name "*.conf" -o -name "*.ini" -o -name "*.xml" -o -name "*.cfg" -o -name "*.rc" \) 2>/dev/null | sort) )

        if [ ${#config_files[@]} -ne 0 ]; then
            echo "Nalezené konfigurační soubory pro $app_name:"
            for config in "${config_files[@]}"; do
                echo "- $config"
            done
        else
            echo "Nenalezeny žádné konfigurační soubory pro $app_name"
        fi
    }

    # Funkce pro porovnávání aplikací mezi systémy
    compare_apps() {
        local -n apps1="$1" # název proměnné je zadán v argumentu 1
        local -n apps2="$2" # název proměnné je zadán v argumentu 2
        local mode="$3"

        # Ověření, zda jsou předané názvy proměnných platné
        if [[ -z ${apps1+_} ]] || [[ -z ${apps2+_} ]]; then
            echo "Chyba: Neplatný název proměnné pro apps1 nebo apps2."
            return 1
        fi
        echo "Porovnávání aplikací..."
        IFS=$'\n'
        if [[ "$mode" == "normal" ]]; then
            echo "Aplikace pouze na prvním systému:"
            for app in "${apps1[@]}"; do
                if [[ ! " ${apps2[*]} " == *" $app "* ]]; then
                    echo "$app"
                fi
            done
            echo "Aplikace pouze na druhém systému:"
            for app in "${apps2[@]}"; do
                if [[ ! " ${apps1[*]} " == *" $app "* ]]; then
                    echo "$app"
                fi
            done
        elif [[ "$mode" == "reverse" ]]; then
            echo "Aplikace v obou systémech:"
            for app in "${apps1[@]}"; do
                if [[ " ${apps2[*]} " == *" $app "* ]]; then
                    echo "$app"
                fi
            done
        fi
        unset IFS
        # Uložení výsledků do souboru
        save_results "$mode" "${apps1[@]}" "${apps2[@]}"
    }

    # Funkce pro uložení výsledků do souboru
    save_results() {
        local mode="$1"
        shift
        local apps1=("$@")
        shift ${#apps1[@]}
        local apps2=("$@")

        local filename="comparison_result_$(date +%Y%m%d_%H%M%S).txt"

        echo "Ukládání výsledků do $filename..."

        {
            echo "Výsledky porovnávání aplikací ($mode):"
            echo "--------------------------------------"
            IFS=$'\n'
            if [[ "$mode" == "normal" ]]; then
                echo "Aplikace pouze v prvním systému:"
                for app in "${apps1[@]}"; do
                    if [[ ! " ${apps2[*]} " == *" $app "* ]]; then
                        echo "$app"
                    fi
                done

                echo "Aplikace pouze v druhém systému:"
                for app in "${apps2[@]}"; do
                    if [[ ! " ${apps1[*]} " == *" $app "* ]]; then
                        echo "$app"
                    fi
                done
            elif [[ "$mode" == "reverse" ]]; then
                echo "Aplikace v obou systémech:"
                for app in "${apps1[@]}"; do
                    if [[ " ${apps2[*]} " == *" $app "* ]]; then
                        echo "$app"
                    fi
                done
            fi
            unset IFS
        } > "$filename"

        echo "Výsledky byly uloženy do $filename"
    }

    # Inicializace proměnných
    # Inicializace proměnných
    local paths=()
    local root_path="/"
    local home_path="$HOME"
    local external_root=""
    local external_home=""
    local next_external_root=""
    local next_external_home=""
    local compare_mode="normal" # výchozí hodnota (opak je "reverse")
    local compare_style=0


    # Zpracování argumentů
    while [[ "$#" -gt 0 ]]; do    # iteruje přes všechny argumenty, které byly předány skriptu nebo funkci.
        case "$1" in
            all)
                paths=(
                    "$root_path/usr/share/applications"
                    "$home_path/.local/share/applications"
                    "$root_path/opt"
                    "$home_path/Plocha"

                    "$home_path/.local/share/xfce4/helpers"
                )
                ;;
            share)
                paths=(
                    "$root_path/usr/share/applications"
                    "$home_path/.local/share/applications"
                )
                ;;
            system)
                paths=(
                    "$root_path/usr/share/applications"
                )
                ;;
            plocha)
                paths=(
                    "$home_path/Plocha"
                )
                ;;
            opt)
                paths=(
                    "$root_path/opt"
                )
                ;;

# Pokud byste měli argument --mounted-device=/media/toshiba, pak:

# ${1} by obsahovalo --mounted-device=/media/toshiba.
# Výraz ${1#*=} by odstranil vše před a včetně =, takže by výstupem bylo /media/toshiba. 
# Pokud chcete zpracovat více argumentů, musíte se ujistit, že správně iterujete přes všechny argumenty.


            --mounted-device=*)

            if [[ -z "$external_root" ]]; then
                external_root="${1#*=}"
            fi
            if [[ -z "$external_home" ]]; then
                external_home="$external_root/home"  # Nastavení home na /media/toshiba/home
            fi

                ;;
            --mounted-root=*)
                external_root="${1#*=}"
                ;;
            --mounted-home=*)
                external_home="${1#*=}"
                ;;
            --mounted-next-device=*)

            if [[ -z "$next_external_root" ]]; then
                next_external_root="${1#*=}"
            fi
            if [[ -z "$next_external_home" ]]; then
                next_external_home="$next_external_root/home"  # Nastavení home na /media/toshiba/home
            fi

                ;;
            --mounted-next-root=*)
                next_external_root="${1#*=}"
                ;;
            --mounted-next-home=*)
                next_external_home="${1#*=}"
                ;;
            --compare)
                compare_mode="normal"
                compare_style=1
                ;;
            --compare=reverse)
                compare_mode="reverse"
                compare_style=1
                ;;
            *)
                echo "Neplatný argument: $1"
                return 1
                ;;
        esac
        shift
    done

    # Pole pro ukládání aplikací
    declare -a external_system1_apps
    declare -a external_system2_apps

    # Zpracování .desktop souborů na obou systémech
    process_desktop_files external_system1_apps "${paths[@]}"

    # Pokud je připojeno další zařízení, zpracuje se také
    if [[ -n "$external_root" || -n "$external_home" ]]; then
        external_paths=(
            "$external_root/usr/share/applications"
            "$external_home/.local/share/applications"
            "$external_root/opt"
            "$external_home/Plocha"

            "$external_home/.local/share/xfce4/helpers"
        )
        process_desktop_files external_system2_apps "${external_paths[@]}"
    fi

    # Porovnání aplikací, pokud je režim porovnávání specifikován
    if [[ -n "$compare_mode" ]]; then
        compare_apps external_system1_apps external_system2_apps "$compare_mode"
    fi

    # Vyhledání konfiguračních souborů pro každou aplikaci na prvním systému
    IFS=$'\n'
    for app in "${external_system1_apps[@]}"; do
        process_config_files "$app"
    done

    unset IFS

}

Vysvětlení hlavních částí:

  1. Zpracování argumentů:

    • Argumenty jako all, share, icons, system, plocha, opt definují, které cesty mají být prohledány pro aplikace a konfigurační soubory.
    • Přidány argumenty pro specifikaci připojených zařízení, kořenového adresáře a domovských složek (--mounted-device, --mounted-root, --mounted-home, --mounted-next-device, --mounted-next-root, --mounted-next-home).
    • Argumenty --compare a --compare=reverse určují, zda se má provést porovnání aplikací mezi systémy.
  2. Porovnání aplikací:

    • compare_apps() porovnává aplikace mezi dvěma systémy podle zadaného režimu (normal nebo reverse).
    • Výsledky porovnání se ukládají do textového souboru s časovým razítkem pomocí funkce save_results().
  3. Zpracování a ukládání výsledků:

    • Funkce save_results() ukládá výsledky do souboru s názvem, který obsahuje datum a čas, což umožňuje snadné rozlišení mezi různými porovnáními.

Tento skript nyní plně zpracovává argumenty, porovnává aplikace mezi systémy, zpracovává jejich konfigurační soubory, a výsledky porovnání ukládá do souboru. Je navržen tak, aby byl modulární a flexibilní pro různé scénáře použití.

Informace:

Jaké typy souborů se tedy hledají při zadání system? Omezujete to na hledání pouze spustitelných souborů protože je to funkce na hledání souborů .desktop. 

Systémové aplikace

A dále pokud daný balíček má více souborů spustitelných, přijde mi zbytečné je všechny vypisovat. To vidím jako nevýhodu toho výpisu /usr/bin protože tam není jasné k čemu je nebo jakou aplikaci reprezentuje. Tam budou také soubory systémové jako find, grep apod. což nepotřebuji vypisovat, mě spíš šlo o výpis toho co uživatel přiinstalovává pomocí apt a není to běžná součást systému. Nedá se toto zjistit z nějakého konfiguračního souboru který používá apt? Třeba z databáze, kterou bych si načetl pomocí jiného programu a prošel, abych zjistil co ten systém má nainstalované? Dále problém toho all je zdá se v tom, že nerozlišuje co se vlastně hledá jestli ikony, nebo .desktop (plocha) nebo skripty a programy (.sh a spustitelné soubory) a konfiguráky...

Při použití aktuálního skriptu na režim system dochází k omezenému rozlišení, což může vést k zbytečnému výpisu systémových souborů, které nejsou relevantní pro uživatele. Také nerozlišuje různé typy souborů, jako jsou ikony, spustitelné soubory, .desktop soubory a konfigurační soubory. To vše může být upraveno a rozšířeno tak, aby skript lépe splňoval vaše požadavky. Níže jsou možné vylepšení a odpovědi na vaše dotazy.

1. Vyhledávání souborů při použití system:

V aktuálním nastavení skriptu jsou v režimu system prohledávány následující adresáře:

  • /usr/share/applications – obsahuje .desktop soubory, které reprezentují grafické aplikace.
  • /usr/bin – obsahuje spustitelné soubory, včetně systémových binárek i aplikací nainstalovaných pomocí balíčkovacího systému.

Problém, který zmiňujete, je ten, že v adresáři /usr/bin je mnoho systémových souborů, které nepotřebujete vypsat. Zaměřit se na aplikace nainstalované uživatelem pomocí apt je dobrý nápad.

2. Identifikace uživatelsky nainstalovaných aplikací:

Abychom se vyhnuli vypisování systémových nástrojů a zaměřili se na aplikace instalované uživatelem, můžeme využít informace z balíčkovacího systému dpkg, který je základem pro apt. Seznam nainstalovaných balíčků lze získat z databáze dpkg

3. Návrh budoucí implementace kromě ručního prohledání dpkg  souboru status

show-apps() {
    # Funkce pro načtení aplikací nainstalovaných pomocí APT
    list_installed_apps() {
        dpkg-query -W -f='${binary:Package}\n'  # (ŠPATNĚ!)
    }

    # Funkce pro nalezení spustitelných souborů pro dané balíčky
    find_binaries_for_apps() {
        local apps=("$@")
        local binaries=()

        IFS=$'\n'
        for app in "${apps[@]}"; do
            # Najít všechny soubory související s balíčkem
            package_files=$(dpkg-query -L "$app" | grep "/usr/bin/")
            if [ -n "$package_files" ]; then
                binaries+=("$package_files")
            fi
        done

        unset IFS
        echo "${binaries[@]}"
    }

    # Funkce pro zpracování a zobrazení aplikací
    process_system_apps() {
        echo "Vyhledávání aplikací nainstalovaných pomocí APT..."
        installed_apps=($(list_installed_apps))
        if [ ${#installed_apps[@]} -eq 0 ]; then
            echo "Nenalezeny žádné aplikace nainstalované pomocí APT."
            return
        fi

        echo "Nalezené aplikace:"

        IFS=$'\n'
        for app in "${installed_apps[@]}"; do
            echo "$app"
        done

        unset IFS


        # Najít spustitelné soubory pro každou aplikaci
        echo "Vyhledávání spustitelných souborů pro nalezené aplikace..."
        binaries=$(find_binaries_for_apps "${installed_apps[@]}")
        echo "Spustitelné soubory:"
        for binary in ${binaries[@]}; do
            echo "- $binary"
        done

    }

    # Zpracování argumentů
    while [[ "$#" -gt 0 ]]; do
        case "$1" in
            system)
                process_system_apps
                ;;
            *)
                echo "Neplatný argument: $1"
                return 1
                ;;
        esac
        shift
    done
}

Vysvětlení nového přístupu:

  1. list_installed_apps(): Tato funkce využívá dpkg-query k načtení seznamu všech balíčků, které jsou nainstalovány na systému pomocí APT. (NESPRÁVNÉ ŘEŠENÍ, NUTNO PŘIDAT PROHLEDÁNÍ SOUBORU status od dpkg)
  2. find_binaries_for_apps(): Tato funkce pro každý balíček najde soubory umístěné v /usr/bin, které jsou součástí balíčku. Tím získáte jen spustitelné soubory, které jsou spojeny s uživatelem nainstalovanými aplikacemi. TOTO NEPOTŘEBUJU
  3. Omezení výpisu: Namísto vypisování všech spustitelných souborů v /usr/bin se nyní soustředíte pouze na ty, které jsou spojeny s aplikacemi instalovanými přes APT. TOTO NEPOTŘEBUJU - PROTOŽE CHCI JEN BALÍČKY - takto detailní výpis spustitelných souborů by se hodil jen s argumentem --name=app-name

 

4. Další rozlišení typů souborů v režimu all:

Při použití argumentu all můžete upravit skript tak, aby prohledával a vypisoval různé typy souborů (ikony, .desktop soubory, spustitelné soubory, skripty a konfigurační soubory) odděleně:

  • Ikony: Hledat v /usr/share/icons a ~/.local/share/icons. (ani neexistuje!)
  • .desktop soubory: Hledat v /usr/share/applications a ~/.local/share/applications.
  • Skripty a spustitelné soubory: Hledat v /usr/bin a /opt.
  • Konfigurační soubory: Hledat v ~/.config a dalších relevantních složkách.

Každý typ souboru může být zpracován samostatně s jasným výpisem, co skript našel.

CHYBA

dpkg-query ale vyhledává jen na aktuálním systému, takže tím se nedostanete k aplikacím na tom externím disku toshiba nebo hp ať /media/toshiba/root nebo /media/toshiba nebo /media/hp nebo /media/hp/root ... podporuje tento dpkg-query zadání konkrétního souboru nebo adresáře s databází, aniž bych musel provést připojení přes --bind a chroot do té složky s externím diskem?

ŘEŠENÍ

dpkg-query standardně pracuje pouze s databází balíčků na aktuálním systému. To znamená, že bez použití chroot nebo připojení souborového systému pomocí --bind není možné přímo použít dpkg-query k dotazování na balíčky na jiném systému nainstalovaném na externím disku.

Nicméně, existuje způsob, jakým můžete získat informace o nainstalovaných balíčcích na jiném systému, aniž byste museli provádět chroot. Tento způsob zahrnuje práci přímo s databázovými soubory dpkg, které jsou obvykle uloženy v /var/lib/dpkg/ na cílovém systému.

1. Ruční přístup k databázi dpkg

Na jiném systému (například na připojeném externím disku) je možné ručně přistupovat k souborům databáze balíčků, které se nacházejí ve složce /var/lib/dpkg/. Konkrétně soubor status obsahuje informace o všech nainstalovaných balíčcích.

Pokud je váš systém připojen například na /media/toshiba/root, pak tento soubor bude na cestě:

/media/toshiba/root/var/lib/dpkg/status

2. Vypsání nainstalovaných balíčků

Můžete číst soubor status přímo, například pomocí příkazu grep nebo vytvořit skript, který by tento soubor zpracoval a zobrazil seznam nainstalovaných balíčků:

bash
grep "Package:" /media/toshiba/root/var/lib/dpkg/status

To vám dá seznam všech nainstalovaných balíčků.

3. Zjištění souborů, které patří balíčkům

Pro nalezení konkrétních souborů, které patří balíčkům, můžete použít data z databázového souboru status. Každý balíček má seznam souborů a jejich cest, což lze zpracovat například pomocí skriptu v jazyce Python nebo jiného nástroje, který dokáže efektivně pracovat s textem.

4. Skript pro načtení nainstalovaných balíčků a jejich souborů

Zde je jednoduchý příklad Bash skriptu, který načte nainstalované balíčky z status souboru na externím disku:

 

 

bash
#!/bin/bash

# Cesta k dpkg status souboru na externím disku
status_file="/media/toshiba/root/var/lib/dpkg/status"

# Funkce pro načtení nainstalovaných balíčků
list_installed_packages() {
grep "Package:" "$status_file" | awk '{print $2}'
}

# Funkce pro načtení souborů patřících balíčku
list_package_files() {
local package_name="$1"
awk -v pkg="$package_name" '
$0 ~ "^Package: " pkg {found=1}
found && $0 ~ "^ " {print $0}
found && $0 == "" {found=0}
' "$status_file"
}

# Vypsat všechny nainstalované balíčky
installed_packages=$(list_installed_packages)
echo "Nainstalované balíčky:"
echo "$installed_packages"

# Vypsat soubory patřící k danému balíčku
echo "Zadejte jméno balíčku pro zobrazení jeho souborů:"
read package_name

echo "Soubory patřící balíčku $package_name:"
list_package_files "$package_name"

5. NOVÉ MOŽNOTSTI Souboru status

Ano to je skvělé řešení,  to přináší také nové možnoti.  Uživatel by navíc mohl k show-apps system nebo all přidat další argument --detailed a získal by delší výpis k těm aplikacím co jsou v tom souboru. Normálně by jinak stačil jeden řádek popisu:  
Package: zip
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 623
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Multi-Arch: foreign
Version: 3.0-11build1
Depends: libbz2-1.0, libc6 (>= 2.14)
Recommends: unzip
Description: Archiver for .zip files
 This is InfoZIP's zip program. It produces files that are fully
 compatible with the popular PKZIP program; however, the command line
 options are not identical. In other words, the end result is the same,
 but the methods differ. :-)
 .
 This version supports encryption.
Original-Maintainer: Santiago Vila <sanvila@debian.org>
Homepage: http://www.info-zip.org/Zip.html

 Případně by si mohl vyžádat konkrétní popis ke konkrétní aplikaci něco jako show-apps system --name=zip

 Já vám chci ještě ukázat co mě nezajímá a co mě zajímá pro běžný výpis z toho status: Package: zeitgeist-core
Status: deinstall ok config-files
Priority: optional
Section: utils
Installed-Size: 463
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Source: zeitgeist
Version: 1.0.2-3ubuntu2
Config-Version: 1.0.2-3ubuntu2
Provides: zeitgeist-extension-fts
Source je užitečný, verze je rozhodně důležitá.  Možná i Provides. Installed-Size by byl dobrý ale jen jako ve formátu v megabytech ...MB , Section je užitečná. Priority: Mě asi nezajímá. Následující mě nezajímá: "Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: all
Multi-Arch: foreign
"  Homepage mě taky nezajímá.  .. Následující by mě zajímalo jen v případě detailního výpisu s argumentem --detailed nebo při zadání --name: Depends: libc6 (>= 2.17), liblzma5 (>= 5.2.2)
Breaks: lzip (<< 1.8~rc2)
Conflicts: lzma (<< 9.22-1), xz-lzma


Doplnění argumentů

 

 

Díky za upřesnění, co vás zajímá a co ne. Na základě toho můžeme přizpůsobit skript pro show-apps, aby výstup obsahoval jen potřebné informace, a to jak v běžném, tak detailním výpisu. Zde je, jak bych to provedl:

1. Skript pro show-apps

Budeme mít dvě možnosti výstupu:

  • Základní: Vypisuje pouze základní informace.
  • Detailní: Zobrazuje podrobnější informace včetně těch, které chcete vidět (s parametrem --detailed).

2. Upravený Skript

Zde je příklad, jak můžete přizpůsobit funkci show-apps ve vašem skriptu. Předpokládáme, že máte funkci pro získání informací o balíčcích a jejich zobrazení.

Příklad základního a detailního výpisu:

 #!/bin/bash

show_apps() {
    local detailed=false
    local name_filter=""

    # Zpracování argumentů
    while [[ "$#" -gt 0 ]]; do
        case "$1" in
            --detailed)
                detailed=true
                ;;
            --name=*)
                name_filter="${1#*=}"
                ;;
            system)
                # Zpracování systému, toto je příklad
                get_installed_packages "$detailed" "$name_filter"
                ;;
            *)
                echo "Neplatný argument: $1"
                return 1
                ;;
        esac
        shift
    done
}

get_installed_packages() {
    local detailed="$1"
    local name_filter="$2"

    # Příkaz pro získání seznamu nainstalovaných balíčků
    local dpkg_query_cmd="dpkg-query -W -f='${name_filter:+${name_filter}\n}${name_filter:+${name_filter} }${detailed:+%p %v %s %d %B %I %c %a %P %o %e}\n'}"


    # Získat balíčky z aktuálního systému
    dpkg-query -W -f='${Package}\n' | while read -r pkg; do
        if [[ -n "$name_filter" && "$pkg" != "$name_filter" ]]; then
            continue
        fi
        if [[ "$detailed" == true ]]; then
            # Získat detailní informace o balíčku
            dpkg-query -W -f='${Package:20} ${Version:10} ${Installed-Size:10}MB ${Provides:20} ${Source}\n' "$pkg"
        else
            # Získat základní informace o balíčku
            dpkg-query -W -f='${Package:20} ${Version}\n' "$pkg"
        fi
    done

}


# Volání funkce
show_apps "$@"

3. Vysvětlení

  • Argument --detailed: Aktivuje detailní výstup, který zahrnuje více informací o balíčku.
  • Argument --name: Umožňuje filtrovat výstup podle názvu balíčku.
  • Funkce get_installed_packages: Získá seznam balíčků a v závislosti na volbě argumentu --detailed vypíše buď základní, nebo detailní informace.

Detailní výpis zahrnuje:

  • Package: Název balíčku
  • Version: Verze balíčku
  • Installed-Size: Velikost balíčku (v MB)
  • Provides: Co balíček poskytuje
  • Source: Zdroj balíčku

Tento skript je základním příkladem a může být dále upravován podle vašich potřeb. Doufám, že vám to pomůže k dosažení toho, co potřebujete.


K tomu nutno přidat --short a --general --admin --net --introspection --libs --compiz --x11 --xorg-server --devel --fonts --graphics --video --sound --python --php --python --perl --xfce --kde --gnome --xorg-server --kernel a implementovat "Conffiles:" zjištění cest

1)

--short - zajistí jen krátké výpisy show-apps system pomocí grep "package:" ... nevýhoda: vypíší se všechny aplikace co tam jsou nainstalované

2)

--general - zajistí že se nebudou opakovat aplikace patřící pod tentýž balíček. Vyžaduje to parsování celého souboru. Příkladem je popis "Source: avahi", tento popis se opakuje ačkoliv název balíčku se liší: Zde je příklad výpisu:


Package: avahi-autoipd
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 121
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Source: avahi
Version: 0.7-4ubuntu7.3
Depends: libc6 (>= 2.14), libdaemon0 (>= 0.14), adduser
Recommends: isc-dhcp-client, iproute2
Conflicts: zeroconf
Conffiles:
 /etc/avahi/avahi-autoipd.action 2a6b538cce1bf0abf8d90cb74693a60b
 /etc/dhcp/dhclient-enter-hooks.d/avahi-autoipd eb6a192ce374002226532a7199a7a94a
 /etc/dhcp/dhclient-exit-hooks.d/zzz_avahi-autoipd 911bd916c7aab0ed9b8a6bceb9122a8c
 /etc/network/if-down.d/avahi-autoipd 474077c828246c57e1f453f28dc2cb8c
 /etc/network/if-up.d/avahi-autoipd e810e2f4cf1cea7b36a5cf82467b0a18

Description: ...
Homepage: ...
Original-Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org>

Package: avahi-daemon
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 276
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Multi-Arch: foreign
Source: avahi
Version: 0.7-4ubuntu7.3
Depends: ...
Recommends: libnss-mdns
Suggests: avahi-autoipd
Conffiles:
 ...
Description: ....
Homepage: ...
Original-Maintainer: ...

Package: avahi-utils
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 165
Maintainer: ...
Architecture: amd64
Source: avahi
Version: 0.7-4ubuntu7.3
Depends: ...
Description: ...

Přitom ačkoliv balíček "Package: avahi" neexistuje, je uveden ve zdrojích: "Source: avahi"

takže zdá se že nejprve je nutné projít zdroje a zajistit, že se nebudou opakovat. Jestliže je nalezen název aplikace ze Source: "avahi" pak používat tento název pro tu aplikaci a ne "avahi-tools", "avahi-daemons" apod.

Takže je nejprve hledat v Source: (jedna smyčka), ukončení smyčky. A pak znovu projít soubor smyčkou a zjišťovat jestli je Source definován a pokud ano, jestli jsem už z něj udělal výpis.

3) Konfiguráky... (výpis z dkpg status file)

A dále je možné nasbírat ty informace o konfigurákách.  Conffiles: jen první sloupec obsahuje cestu, následující sloupec už není cesta k souboru.

4) Co nemá defaultní výpis obsahovat:

Dále je nutné, aby defaultní výpis neobsahoval "Section: admin" (ani Section: net. ani Seciton: kernel, ani Section: libs, ani Section: introspection, ani Section: fonts, ani Source: compiz, ani Section: x11, ani Section: xorg-server, ani Section: devel)

protože je tam strašně moc položek, které jsou standardní součástí systému. --admin vypíše pouze administrátorskou sekci

--libs vypíše  jen aplikace ze sekce libs

--net vypíše  jen aplikace ze sekce net

--kernel vypíše  jen aplikace ze sekce kernel

--introspection vypíše jen aplikace ze sekce introspection

--font vypíše jen aplikace nebo balíčky ze sekce fonts

--compiz vypíše jen aplikace nebo balíčky ze sekce compiz

--x11 vypíše jen aplikace nebo balíčky ze sekce x11

--xorg-server vypíše jen aplikace nebo balíčky ze sekce xorg-server

--devel vypíše jen aplikace nebo balíčky ze sekce devel

Dále je nutné, aby defaultní výpis neobsahoval "Section: net"

Dále je nutné, aby defaultní výpis neobsahoval "Section: kernel"

nutné, aby defaultní výpis neobsahoval "Section: libs" 

nutné, aby defaultní výpis neobsahoval "Section: x11" 

nutné, aby defaultní výpis neobsahoval "Section: xorg-server"

nutné, aby defaultní výpis neobsahoval "Section: compiz" 

nutné, aby defaultní výpis neobsahoval "Section: fonts"

nutné, aby defaultní výpis neobsahoval "Section: introspection"

 

Já bych vynechal Section: Net kromě: Filezilla, Samba

Tzn. že z první smyčky se odstraní balíčky s "Section: admin", "Section: net", "Section: kernel", "Section: libs" kromě Filezilla, Samba

balíčky začínající na: google, samba

nebo mající Section: admin, Section: net 

se nezahrnou ale zahrnou se do výsledků při použití --net

Další příklady balíčků které se opakují:

Source: php-symfony-contracts

Source: network-manager

Source: network-manager-applet

Source: python3.8

Source: python3-stdlib-extensions

Source: vlc

Další atribut: --video bude používán jinak než výše uvedené --admin, --net, --kernel, --libs. --video poskytne výpis pouze těch sekcí kde je video, ale pokud --video není uvedeno jako argument, přesto tyto aplikace smí být součástí výpisu.    

Podobně argument --graphics řekne že se mají zobrazit jen aplikace ze sekce sound

Podobně argument --sound řekne že se mají zobrazit jen aplikace ze sekce sound

Podobně argument --xfce řekne že se mají zobrazit jen aplikace ze sekce xFce

Podobně argument --kde řekne že se mají zobrazit jen aplikace ze sekce kde

Podobně argument --gnome řekne že se mají zobrazit jen aplikace ze sekce kde

Podobně argument --web řekne že se mají zobrazit jen aplikace ze sekce web

Podobně argument --php řekne že se mají zobrazit jen aplikace ze sekce php

Podobně argument --python řekne že se mají zobrazit jen aplikace ze sekce python

Podobně argument --perl řekne že se mají zobrazit jen aplikace ze sekce perl

Podobně argument --java řekne že se mají zobrazit jen aplikace ze sekce java

Podobně argument --utils řekne že se mají zobrazit jen aplikace ze sekce utils

Podobně argument --httpd řekne že se mají zobrazit jen aplikace ze sekce httpd

6) Nesmí se zapomenout na to, že Filezilla a Samba mají být součástí defaultního výpisu.

7) Pokud bude probíhat zálohování konfiguráku apod. tak "show-apps system" pouze zálohuje defaultní aplikace z výpisu, ale nový tag --system-all bude zálohovat všechny konfiguráky.

 

automad je dobrý cms na vytváření flat-file blokových prezentací

 automad je dobrý cms na vytváření flat-file blokových prezentací

Štítky

.profile adm administrace Adobe Aho-Corasick AI akcelerace alfa transparence analýza AND any aplikace apt ar archiv asociativní pole atomicity audacity audio audio redirect autentifikace automad automatizace awk balíčkovací systém bash beacon beacon_hint benchmark Bézierovy křivky bezpečnost biblehub BJT blogger boolean Braessův paradox brainstorming BRE buffer buffering bufferované čtení Cache-Conrol Cloudflare cms code Collector Cut-off ColorManager colorpicker common compare config cookies CPU CPU pipe crop css CSS3 curl current code cut čas data loss data lost data transfer reliability datasheet datetime.strptime deb deb-systemd-helper debian debián depricated development dict dioda diody disonance doprava dpkg dpkg -S dpkg-deb drivers EBO editace efekt Emitter Cut-off Current eps ETag evtest exclude exec Expires extrakce jediného extrakce názvu balíčku souboru extrakce obrázků extrakce souboru .deb fflock fflush ffmpeg FIFO file read file write file_get_contents file_get_contents/file_put_contents file_put_contents filter find first_install.sh flat-file flock Fly-back dioda font-face fonty fóra formant-preserving morphing fotorezistor fread functions funkce FuzzyWuzzy fwrite gate gate drive GDVfs gedit gedit-common geolokace getdata Ghostscript GIO glib gnome gnome settings GNU Privacy Guard gnupg gpg gradient-background grafika grep grep -v groupadd grub grub update gs gsettings gtk gtk.css gtk+ hebrejština history hlavičky HS html html 5 https hudba hunspell charakterizace chatGPT chroot chyba ICES IGBT Image img sizes img srcset impedance implementace imshow inference inkscape inrush current install IQ jalový výkon javascript javescript jednocení seznamů js jsonData kapacita součástek klávesnice koeficient zesílení komponenty xFce komunikace se serverem koncept konfigurace kontejner korekce barev Krita KSF kvantifikátor kytara Last-Modified lazy caching led LEFT JOIN librosa ligatury light-locker lightdm linux list log m3u maják manuál map mapování maskování maskování hlasu maskování služby masky matplotlib Max-Age measure melodie memory měření meta MFCC MFCC koeficienty mint Mint 21.3 Mint xFce míry mlt modules moralizace morphologie MOSFET mount moviepy multimedia mysql náběhový proud napěťová ochrana nastavení šablony návod návrh nel Network Error Logging NLP normalizace šedi po resize not Notifications noty NTFS nth-child oblasti oblékání ochrana okruhy přátel OpenVINO IR formát oprava oprava balíčku optočlen org.gnome.desktop.screensaver org.gnome.nm-applet ořezové masky OSHB otázky otázky_jazyky otázky_moralismu_řešení overlay ovladače panely parsování path pdf personifikace photorec php php 4 php 5 php 6 php 7 php 8 phpbb phpBB3 PipeWire pitch plus PN přechody pnp pole Policykit postscript práva profilování program prune průraz přeinstalování překlad přepěťová ochrana přepolování příkazy připojení připojení k síti připojení k wifi pseudokódd pstoedit pulse PulseAudio PWM regulátory pydub python python3 pytorch ramdisk RBE RDSon read reaktance rectifier redakční systém regex regulace vstupního napětí reinstall relyability remount replace restore reverzní geolokace RIGHT JOIN rm robotický hlas role rozvržení disků pro OS linux a data databází řešení samba scan scroll sd karta sdílení sdílení souborů Sec-Fetch-Dest Sec-Fetch-Mode Sec-Fetch-Site Sec-Fetch-User Secure Shell sed Set Cookie show-manual-login show-remote-login shunt schemas schémata schottka signal morphing sink skript skupiny sledovanost sloupce slučování seznamů služby small song sort soubory soundfile spínané zdroje spínání splines split spojování správa diskových zařízení SQL ssh stabilizace napětí stahování stíny stream stream redirect string strojové učení stropové učení subprocess.call supplicant svg syntax systemctl systemd-logind T5 tabulka tabulky Tangentové úsečky tar témata tepelná ztráta terminologie test text-shadow themes thermal runaway time timestamp tkinter tr transformace transistor transition transpose tranzistor tranzistory TS ttf tuple tvorba otázek TVS typografie ubuntu účiník udiskd udisks unconfined underrun unity-greeter update usb usermod uživatelé va charakteristika vala věda vektorová grafika Vgs video virtual devices vocoder Vth vyhledávání vyhledávání soborů výkon vynechání adresářů vytvoření playlistu vývoj webovka while wpa wpa_supplicant wrapovací funkce x xandr xapp-watt xargs -I xed xed-common xfdesktop xml xmp XOR Xorg Xorg Thumbnails xrandr závislosti zdánlivý výkon zdroj zenerka zenerovo napětí zip zip archiv zkratky zpomalení zpracování textu zrychlení zvuk Žalmy