Portál AbcLinuxu, 5. května 2025 23:16
Zdravím,
protřebuji poradit s tím, jak mám pomocí programu "rename" přejmenovat
01003 0_KJV_Bible-Genesis001.mp3 01015 0_KJV_Bible-Genesis002.mp3 01022 0_KJV_Bible-Genesis003.mp3
na
kjv_01_gn_01.mp3 kjv_01_gn_02.mp3 kjv_01_gn_03.mp3
Ještě dodám, že v terminálu se stávající názvy souborů zobrazují (zřejmě kvůli mezeře) s "úvozovkami":
'01003 0_KJV_Bible-Genesis001.mp3' '01015 0_KJV_Bible-Genesis002.mp3' '01022 0_KJV_Bible-Genesis003.mp3'
Poraďte prosím.
Řešení dotazu:
Zkusil jsem tohle:
$ touch '01003 0_KJV_Bible-Genesis001.mp3' '01015 0_KJV_Bible-Genesis002.mp3' '01022 0_KJV_Bible-Genesis003.mp3' $ ls -1 '01003 0_KJV_Bible-Genesis001.mp3' '01015 0_KJV_Bible-Genesis002.mp3' '01022 0_KJV_Bible-Genesis003.mp3' $ rename 's/(\d\d).*Genesis0(\d\d)(.*)/kjv_$1_gn_$2$3/' * $ ls -1 kjv_01_gn_01.mp3 kjv_01_gn_02.mp3 kjv_01_gn_03.mp3
Bere to první dvě číslice a pak poslední dvě před příponou.
Ó děkuji. To je přesně ono.
Nějaké soubory jsem přejmenovával už včera. Bylo to ale podstatně jednodušší a tak jsem si vystačil s Googlem. Dnes mi už ale Google nepomohl. Man page je dost stručná a tak nevím, kde si to nastudovat. Když jsem na netu hledal nějaké příklady použití, pořád jsem narážel na zmínky o Perlu. Jedná se tedy o syntaxi Perlu? Pokud víš, poraď prosím něco (web), kde by se to dalo nastudovat. A nejlépe v češtině.
Jsou to regulární výrazy, nějaký článek je třeba tady: Regulární výrazy nebo na Wikibooks: Regular Expressions.
Text v normálních (závorkách) je tzv. skupina – ty jsou číslované od 1 a dá se na ně odkazovat při nahrazování – buď pomocí toho $1
nebo v některých nástrojích \1
. Skupina 0 je pak celý text, který vyhovoval výrazu.
Hranaté [závorky] jsou výčet. * a + je počet opakování předchozího znaku (nebo znaků z hranaté závorky), buď 0..n nebo 1..n. Nebo pomocí {m,n} jde říct počet opakování od/do. Pak se hodně používají ty \d, \s nebo [0-9], [a-z0-9] atd. to už si dohledáš v těch článcích.
Super. Dík
for soubor in *KJV*; do mv "${soubor}" "$(echo ${soubor} | sed 's/.*Genesis0/kjv_01_gn_/')"; done
Ještě mám jednu otázku. Pro změnu malých písmen na velká slouží:
rename 'y/a-z/A-Z/'
Jak to ale použít rekurzivně pro adresář?
cd adresar rename 'y/a-z/A-Z/' *
cd adresar for soubor in *; do mv "${soubor}" "${soubor^^}"; donebash umoznuje obsah promene prevest na velke pridanim ^^ za nazev promene, nebo na male pridanim ,,
$ priklad="RuZnEvElKaPiSmEnA" $ echo ${priklad^^} RUZNEVELKAPISMENA $ echo ${priklad,,} ruznevelkapismena
nebo po vzoru predchozi reakce se smyckou:cd adresar for soubor in *; do mv "${soubor}" "${soubor^^}"; done
Ne. Situace je totožná. Jsem v adresáři "bk". V něm je 66 podadresářů a v každém z nich jsou soubory. Když tedy v tom adresáři bk zadám ten příkaz, tak se změní jen názvy těch podadresářů, ale názvy souborů v nich už ne.
cd hlavniadresar for adresar in *; do cd ${adresar}; for soubor in *; do mv "${soubor}" "${soubor^^}"; done; cd ..; donenebo s tim rename
cd hlavniadresar for adresar in *; do cd ${adresar}; rename 'y/a-z/A-Z/' *; cd ..; donenicmene to uz reseni pres find zacina byt cistejsi/prehlednejsi
Dík za všechno. Zítra se na to podívám.
Tak jsem se k tomu dostal až teď. Zkusil jsem:
cd hlavniadresar for adresar in *; do cd ${adresar}; rename 'y/a-z/A-Z/' *; cd ..; done
A tohle už zafungovalo.
Díky
PS: Tu smyčku chápu. To je fikaný. Akorát nechápu, proč jsi v tom příkazu použil slovo "adresar"?
Místo něj mohlo být libovolné slovo?
Ne k3ďo. Přesně tohle jsem taky zkoušel a výsledek je ten, že se přejmenují jen adresáře v adresáři, kde se nacházím. Ale soubory v nich ne.
Jakýkoli příkaz můžeš pustit nad soubory rekurzivně pomocí:
find -print0 | xargs -0 -n1 echo
Akorát místo echo
dáš svůj příkaz a ono ho to spustí pro každý nalezený soubor s parametrem cesta-k-souboru.
Find umí různě filtrovat, např. -type f
najde jen soubory a vynechá adresáře.
No ten find jsem právě včera používal, ale nevěděl jsem, jak jej do příkazu zakomponovat, aby se to dělo rekurzivně. Každopádně díky. Zítra to zkusím a když tak ještě napíšu.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.