Příkaz cat měl dnes svůj den (International Cat Day). Kolikrát jste jej dnes použili? Nebo máte raději bat?
Minetest (Wikipedie), multiplatformní open source voxelový herní engine a hra inspirovaná Minecraftem, byl vydán ve verzi 5.6.0. Podrobný přehled novinek v changelogu. Instalovat lze také z Flathubu a Snapcraftu.
Projekt Debian získal doménu debian.community. Jedná se o výsledek doménového sporu u WIPO/UDRP: "Doména debian.community byla zaregistrována ve zlé víře a byla používána k pošpinění ochranných známek projektu Debian". Viz Wayback Machine.
Byl publikován detailní rozbor zranitelnosti CVE-2022-29582 v Linuxu v io_uring. Zranitelnost byla v upstreamu opravena již v dubnu.
Byly zpracovány a na YouTube zveřejněny videozáznamy jednotlivých přednášek z letošního InstallFestu.
Byla vydána verze 9.3 open source unixového operačního systému NetBSD (Wikipedie). Přehled novinek v poznámkách k vydání.
Po 9 měsících od vydání verze 3.4 byla vydána nová verze 3.5 multiplatformního open source herního enginu Godot (Wikipedie, GitHub). Přehled novinek i s náhledy a videi v příspěvku na blogu a na YouTube. Major verze 4.0 se blíží k první betě.
Alexandre Prokoudine publikoval na serveru Libre Arts článek 8+1 audio editorů pro Linux, které nejsou Audacity. Věnuje se editorům: Sweep, mhWaveEdit / gWaveEdit, KWave, ReZound, EKO, Snd, Gtk Wave Cleaner, WaveSurfer a SoX.
Byla vydána verze 8.0.0 vizuálního programovacího jazyka Snap! (Wikipedie) inspirovaného jazykem Scratch (Wikipedie). Přehled novinek na GitHubu.
Byla vydána nová verze 1.70 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.70 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Jakým příkazem by se dalo udělat hromadné přejmenování souborů? Omylem jsem udelal MP3 s koncovkou *.OGG a potrebuji je hromadne prejmenovat na *.MP3. Zkousel jsem jen:
mv *.OGG *.MP3, ale to moc nefunguje.
rename 's/.OGG$/.MP3/' *.MP3
$ rename 'y/A-Z/a-z/' *
:-)
rename moje tvoje *
V Debianu je rename skript v perlu. Mělo by to jít asi takhle
rename 's/moje/tvoje/' *
Přinejmenším to tvrdí dokumentace.
$ mmv "moje*" "tvoje#1"
Ovsem jen rucne, ve skriptech se nerad spoleham na program, kterej nemusi kazdy mit.
$whatis mmv
mmv - move/copy/append/link multiple files by wildcard patterns
"Mmv moves (or copies, appends, or links, as specified) each source file matching a from pattern to the target name specified by the to pattern. This action is performed safely, i.e. without any unexpected deletion of files due to collisions. Furthermore, before doing anything, mmv attempts to detect any errors that would result from the entire set of actions specified and gives the user the choice of either proceeding by avoiding the offending parts or aborting."
Asi nic extra, proste mi to nekdo doporucil, bylo to maly a bylo to jako balik v debianu.
for i in `ls ~/tmp/tmp-nm/*.xxx` do let n=n+1 echo menim nazov suboru na $n.yyy mmv "*.xxx" "$n.yyy" echo $i done
Konstrukci for i in `ls ~/tmp/tmp-nm/*.xxx`
napiš vlastní krví na pergamen vyrobený z kůže 17 leté panny. Pergamen potři sádlem z netopýra a posyp práškem z kořene mandragory. O 3. ouplňku po božím hodě přesně o půlnoci sněz a ZAPOMEŇ!
Krom toho, že místo for i in `ls ~/tmp/tmp-nm/*.xxx`
by většina normálních lidí napsala přinejmenším for i in ~/tmp/tmp-nm/*.xxx
a zbavil se tak probl0mu s mezerama, nevím co by jsi s tím dělal, kdyby těch souborů v tom adresáři bylo pár tisícovek.
Mimoto ten tvůj script, kdyby dělal to co se tam snažíš napsat, tak by ze souborů a.xxx b.xxx c.xxx vyrobil jeden jediný soubor 1.yyy s obsahem c.xxx, o a.xxx a b.xxx by jsi nenávratně přišel a pak by se odporoučel. Naštěstí mmv by tě to nedovolil udělat. Pokud už se chceš tvářit, že mmv ani rename nemusí vždy existovat, tak co třeba takhle:
ls ~/tmp/tmp-nm/*.xxx | while read i; do mv $i ${i%xxx}yyy; done
for i in ~/tmp/tmp-nm/*.xxx; do mv $i ${i%xxx}yyy; doneTo s tím ls by mělo právě ten následek, že by přetekla příkazová řádka.
ls ~/tmp/tmp-nm/*.xxx
. Provede expanzi ~/tmp/tmp-nm/*.xxx
čímž mu může vzniknout první chyba a to překročení velikosti příkazové řádky 64KB. Provede exec ls s parametry vzniklími tou expanzí a výstup stdout odchytí a umístí do príkazového řádku for i in
čímž už potřetí vyrobíme ten samý seznam souborů, ale teď už s tím nepracuje jako se seznamem parametrů, ale kako textovým souborem! No a logicky ho zpracuje na nový seznam parametrů. Pro každý z těchto parametrů volý potom vnitřek smyčky. no a když přeskočíme ty nezajímavé věci tak při volání mmv provede znovu expanzi *.xxx v aktuálním adresáři (což jaksi není to co by jsi chtěl) no a nedej bože aby jsi byl zrovna v adresáři kde jsou nějaké soubory *.xxx protože se zase provede expanze (no a zase nesmý být překročena pamět pro příkazový řádek 64KB) no a s těmito paramatry je zavoláno mmv a nakonec se hodí 1.yyy (a při druhém volání 2.yyy) co s tím udělá mmv, no to ...
mv i$ `echo $i| sed 's/xxx$/yyy/'`použil
mv $i ${i%xxx}yyy(nemluvě o použití
filtr <soubor
místo cat soubor |filtr
a filtr <<<"nějaký text"
místo echo "nějaký text" | filtr
) to chce trochu praxe. Nemluvě o vychytávkách typu exec <soubora konstrukce
tar cf >(cd nekam; tar x) cosik(ekvivalent
tar c cosik | tar xC nekam
). Hold to není tak jednoduché. Takže ještě k tomu přejmenování (když se Yeti nebude zlobit, že to dělám v bashi a ne nějak přes filtry a xargs n=0 for i in ~/tmp/tmp-nm/*.xxx do let n++ mv "$i" "${i%/*}/$(printf "%03d" $n).yyy" done
Bohužel takový link neznám, ale matně si vzpomínám, že jsem na něco takového kdysi narazil. Možná by se dalo i něco najít u O'Reily.
Mě hodně pomáhá, když si představím jak by to tak asi mohlo být naprogramované a znalost střev unixu (třeba z Skočovský, L.:UNIX POSIX Plan 9). Shell je jak název napovídá jen obálka nad voláními jádra No a tak nejjednodušeji implementují to co je jednoduše převoditelné na volání jádra a všechno složitější se víc a víc od jádra vzdaluje. Vycházím z jednoduché premisy, že všichni programátoři jsou líní jako já a položím si jednoduchou otázku: Jak bych to naprogramoval, tak abych se nejmíň nadřel? Třeba cyklus
for i in list
- bash čte zdrojový text na svém vstupu, rozparsuje 'for' 'i' 'in', no tak si udělám proměnnou 'i' a budu čekat, že následuje nějaký seznam a teď to nejjednodužší co mě napadne, že udělám expanzi toho seznamu, jenže jsem zjistil, že to by mohlo taky zabrat příliš moc paměti. No tak jak by se to asi dalo jinak naprogramovat? No třeba, že bych bral jeden parametr (nebo výsledek expanze) po druhém a z každým pak prováděl to co najdu po do
? To samé by se dalo dělat, když tam bude substituce příkazu (bash(1)/Command Substitution
jako $(command)
nebo `command`
, to první používám radši, protože se to pak dá zanořovat). To by se dalo udělat třeba tak, že bych se odforkoval a pak četl postupně stdout toho subprocesu přes pipe a zacházel s tím jako s výsledkem expanze. To zní složitě, ale když si představím, jak by se to naprogramovalo, tak je to malý kousíček kódu v C s pár voláníma jádra, které všechno to složité udělají za mě.
No a tak postupuju, když něco nefunguje, nebo chci vědět jak to funguje a chci aby to fungovalo co nejlépe, nejrychleji, s nejmenšími nároky na paměť a podobně. Prostě se snažím představit jak to asi ti stejně líní programátoři naprogramovali. Ona lenost v programování, znamená méně kódu a tím méně chyb, méně spotřebované paměti a méně problémů. No a vo tom je unix.
ls *.ogg | sed 's/...$//'| xargs -i mv {}ogg {}mp3
Tiskni
Sdílej: