Portál AbcLinuxu, 16. května 2024 23:58


Dotaz: rename - syntax

Petr Fiedler avatar 14.5.2019 14:20 Petr Fiedler | skóre: 35 | blog: Poradna | Brno
rename - syntax
Přečteno: 571×
Odpovědět | Admin

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:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

xkucf03 avatar 14.5.2019 14:44 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: rename - syntax
Odpovědět | | Sbalit | Link | Blokovat | Admin

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.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
Petr Fiedler avatar 14.5.2019 15:07 Petr Fiedler | skóre: 35 | blog: Poradna | Brno
Rozbalit Rozbalit vše Re: rename - syntax

Ó 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ě.

xkucf03 avatar 14.5.2019 15:30 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: rename - syntax

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.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
Petr Fiedler avatar 14.5.2019 16:06 Petr Fiedler | skóre: 35 | blog: Poradna | Brno
Rozbalit Rozbalit vše Re: rename - syntax

Super. Dík

k3dAR avatar 14.5.2019 17:38 k3dAR | skóre: 62
Rozbalit Rozbalit vše Re: rename - syntax
pripadne zdlouhaveji, ale prehledneji :-)
for soubor in *KJV*; do mv "${soubor}" "$(echo ${soubor} | sed 's/.*Genesis0/kjv_01_gn_/')"; done
porad nemam telo, ale uz mam hlavu... nobody
k3dAR avatar 14.5.2019 17:39 k3dAR | skóre: 62
Rozbalit Rozbalit vše Re: rename - syntax
barvy sezrali _ ;-)
for soubor in *KJV*; do mv "${soubor}" "$(echo ${soubor} | sed 's/.*Genesis0/kjv_01_gn_/')"; done
porad nemam telo, ale uz mam hlavu... nobody
Petr Fiedler avatar 14.5.2019 19:39 Petr Fiedler | skóre: 35 | blog: Poradna | Brno
Rozbalit Rozbalit vše Re: rename - syntax
Odpovědět | | Sbalit | Link | Blokovat | Admin

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ář?

k3dAR avatar 14.5.2019 20:08 k3dAR | skóre: 62
Rozbalit Rozbalit vše Re: rename - syntax
cd adresar
rename 'y/a-z/A-Z/' *
porad nemam telo, ale uz mam hlavu... nobody
k3dAR avatar 14.5.2019 20:13 k3dAR | skóre: 62
Rozbalit Rozbalit vše Re: rename - syntax
nebo po vzoru predchozi reakce se smyckou:
cd adresar
for soubor in *; do mv "${soubor}" "${soubor^^}"; done
bash umoznuje obsah promene prevest na velke pridanim ^^ za nazev promene, nebo na male pridanim ,,
priklad:
$ priklad="RuZnEvElKaPiSmEnA"

$ echo ${priklad^^}
RUZNEVELKAPISMENA

$ echo ${priklad,,}
ruznevelkapismena
porad nemam telo, ale uz mam hlavu... nobody
Petr Fiedler avatar 14.5.2019 20:29 Petr Fiedler | skóre: 35 | blog: Poradna | Brno
Rozbalit Rozbalit vše Re: rename - syntax
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.

k3dAR avatar 14.5.2019 21:42 k3dAR | skóre: 62
Rozbalit Rozbalit vše Re: rename - syntax
tak pak pridat nad to dalsi smyscku co proleze adresare
cd hlavniadresar
for adresar in *; do cd ${adresar}; for soubor in *; do mv "${soubor}" "${soubor^^}"; done; cd ..; done
nebo s tim rename
cd hlavniadresar
for adresar in *; do cd ${adresar}; rename 'y/a-z/A-Z/' *; cd ..; done
nicmene to uz reseni pres find zacina byt cistejsi/prehlednejsi :-)
(me priklady mimojine pocitaji ze v hlavnimadresari jsou jen podadresare a v nich jsou jen soubory)
porad nemam telo, ale uz mam hlavu... nobody
Petr Fiedler avatar 14.5.2019 22:18 Petr Fiedler | skóre: 35 | blog: Poradna | Brno
Rozbalit Rozbalit vše Re: rename - syntax

Dík za všechno. Zítra se na to podívám.

Petr Fiedler avatar 9.6.2019 21:30 Petr Fiedler | skóre: 35 | blog: Poradna | Brno
Rozbalit Rozbalit vše Re: rename - syntax

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?

Petr Fiedler avatar 14.5.2019 20:18 Petr Fiedler | skóre: 35 | blog: Poradna | Brno
Rozbalit Rozbalit vše Re: rename - syntax

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.

xkucf03 avatar 14.5.2019 20:19 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: rename - syntax

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.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
Petr Fiedler avatar 14.5.2019 22:17 Petr Fiedler | skóre: 35 | blog: Poradna | Brno
Rozbalit Rozbalit vše Re: rename - syntax

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.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.