Portál AbcLinuxu, 16. května 2025 18:54

Dotaz: hromadné přejmenování

21.8.2003 21:04 Jiří Masák
hromadné přejmenování
Přečteno: 2757×
Odpovědět | Admin
Nazdar lidi!

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.

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

Odpovědi

21.8.2003 21:23 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše hromadné přejmenováni
Odpovědět | | Sbalit | Link | Blokovat | Admin
nejprve, proč nefunguje mv *.ogg *.mp3: hvězdičky expanduje shell, nikoli každý příkaz po svém -- takže mv dostane už expandovaný seznam souborů, a důsledky jsou jasné... už tu několikát proběhl flamewar, co je ,nejjednodušší`... např. ls *.ogg | perl -nle '$o=$_;rename$o,$_ if s/\.ogg$/.mp3/;'
21.8.2003 22:34 Beda
Rozbalit Rozbalit vše hromadné přejmenováni
cooo??? yeti nemel bys chodit tak casto domu na pokec s cinanama, pak ti neni rozumet ;) ale jo kdyz to funguje...
21.8.2003 22:53 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše hromadné přejmenováni
já mám osobně příkaz pmv, kterému se zadají regex a replacement... a výsledek znáš. podobných skriptů je na fm][ celá řada... pokud jde o nečitelnost čehokoli, co napsal v perlu někdo jiný než ty sám, tak podle RWS je to nejspíš výhoda (see http://abclinuxu.cz/hardware/ViewRelation?relationId=38403 :o) (já hlavně doufám, že se zas někdo nevytáhne nějaký půlstránkový skript v shellu, implementující rekursi, používající regulární výrazy v bashi a nefungující, když jména souborů obsahují nějaké speciální znaky... ;-)))
egg avatar 22.8.2003 15:01 egg | skóre: 20 | Praha
Rozbalit Rozbalit vše hromadné přejmenováni
Odpovědět | | Sbalit | Link | Blokovat | Admin
rename 's/.OGG$/.MP3/' *.MP3
Proč led klouže? --Aldebaran bulletin
22.8.2003 16:19 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše hromadné přejmenováni
hm, to jsem netušil, že existuje -- ale moje rename stejně žádné regulární výrazy neumí (co to máš za rename?); nicméně v tomto jednoduchém prípadě by fungovalo rename .ogg .mp3 *.mp3
egg avatar 23.8.2003 11:42 egg | skóre: 20 | Praha
Rozbalit Rozbalit vše hromadné přejmenováni
Mam ho ve svem Debianu, nevim z ktereho balicku se vzal. Autorem je Larry Wall a je to perl skript, ktery bere perlovske vyrazy. Ale vic se toho z manualove stranky vycist neda, ani verze. Funguje to krasne, zvlast moje oblibene
$ rename 'y/A-Z/a-z/' *      :-)
Dalibor Smolík avatar 27.7.2004 08:52 Dalibor Smolík | skóre: 54 | blog: Postrehy_ze_zivota | 50°5'31.93"N,14°19'35.51"E
Rozbalit Rozbalit vše Re: hromadné přejmenováni
Mám trochu jiný problém potřebuji přejmenovat soubory např. moje01, moje02, moje03 .. na tvoje01, tvoje02, tvoje03
pomocí rename se mi to stále nedaří. Mohl by mi někdo poradit?
Rozdíly v řeči a ve zvyklostech neznamenají vůbec nic, budeme-li mít stejné cíle a otevřená srdce.
27.7.2004 09:03 VícNežNic | skóre: 42 | blog: Spáleniště | Ne dost daleko
Rozbalit Rozbalit vše Re: hromadné přejmenováni
No, u mého rename (tj. toho které je ve Slacku) by stačilo napsat
rename moje tvoje *
prvni arg. je retezec ktery chcete nahradit, druhy kterym ho chcete nahradit a ten treti (a dalsi) jsou ve kterych souborech to chcete nahradit
Copak toho není dost?
Dalibor Smolík avatar 27.7.2004 09:48 Dalibor Smolík | skóre: 54 | blog: Postrehy_ze_zivota | 50°5'31.93"N,14°19'35.51"E
Rozbalit Rozbalit vše Re: hromadné přejmenováni
Prave tady je problem (mam Debian)
rename moje tvoje *
Bareword "ddd" not allowed while "strict subs" in use at (eval 1) line 1.
xxx@server:~/aac$
Rozdíly v řeči a ve zvyklostech neznamenají vůbec nic, budeme-li mít stejné cíle a otevřená srdce.
27.7.2004 10:26 VícNežNic | skóre: 42 | blog: Spáleniště | Ne dost daleko
Rozbalit Rozbalit vše Re: hromadné přejmenováni

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.

Copak toho není dost?
Dalibor Smolík avatar 27.7.2004 10:29 Dalibor Smolík | skóre: 54 | blog: Postrehy_ze_zivota | 50°5'31.93"N,14°19'35.51"E
Rozbalit Rozbalit vše Re: hromadné přejmenováni
ano, tohle funguje. Díky.
Rozdíly v řeči a ve zvyklostech neznamenají vůbec nic, budeme-li mít stejné cíle a otevřená srdce.
30.6.2006 20:46 wohny
Rozbalit Rozbalit vše Re: hromadné přejmenováni
mě to funguje přesně takhle, rename mam ze standardniho balicku FC3 ps. diky
30.6.2006 21:28 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: hromadné přejmenováni
A to vám trvalo dva roky, než jste to vyzkoušel? :-)
Valoun avatar 27.7.2004 11:18 Valoun | skóre: 30 | blog: Psavec | Středočeský kraj
Rozbalit Rozbalit vše Re: hromadné přejmenováni
Na to pouzivam mmv.

$ mmv "moje*" "tvoje#1"

Ovsem jen rucne, ve skriptech se nerad spoleham na program, kterej nemusi kazdy mit.
27.7.2004 11:33 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: hromadné přejmenováni
Takhle funguje rename v Debianu (možná i jinde). Červené klobouky mají bůhvíproč jiné rename, ale i s ním se dá přežít ;-)
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
Valoun avatar 22.8.2003 23:20 Valoun | skóre: 30 | blog: Psavec | Středočeský kraj
Rozbalit Rozbalit vše hromadné přejmenováni
Odpovědět | | Sbalit | Link | Blokovat | Admin
mmv "*.ogg" "#1.mp3"
22.8.2003 23:33 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše hromadné přejmenováni
bash: mmv: command not found ;-) takových věcí je na fm][ zhruba třicet, i v Javě a s GUI... a kdekdo si napsal vlastní... je mmv něčím výjimečné?
Valoun avatar 27.7.2004 11:15 Valoun | skóre: 30 | blog: Psavec | Středočeský kraj
Rozbalit Rozbalit vše Re: hromadné přejmenováni
$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.
Dalibor Smolík avatar 27.7.2004 12:33 Dalibor Smolík | skóre: 54 | blog: Postrehy_ze_zivota | 50°5'31.93"N,14°19'35.51"E
Rozbalit Rozbalit vše Re: hromadné přejmenováni
příkaz mmv jsem si musel doinstalovat (Debian), pak funguje dobře.
Rozdíly v řeči a ve zvyklostech neznamenají vůbec nic, budeme-li mít stejné cíle a otevřená srdce.
27.7.2004 13:04 Paw
Rozbalit Rozbalit vše Re: hromadné přejmenováni
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ja jako liny klikac pouzivam program "KRename". - http://www.krename.net/

Paw
28.7.2004 10:46 coques | skóre: 21 | blog: FailSystem
Rozbalit Rozbalit vše Re: hromadné přejmenováni
chau, aj ja potrebujem hromadne premenovat nazvy suborov, len nazvy suborov su vo formate: jeden subor.xxx, cize s medzerou... klasicky v prikazovom riadku nie je problem, no akonahle to dam do skriptu, tak mi zacne premenovavat najprv jeden a potom subor.xxx, cize to je blud, neviete mi poradit preco? ..a skusam to takymto sposobom...
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 
                        
Polívčička byla..
28.7.2004 13:42 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: hromadné přejmenováni

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
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
28.7.2004 14:24 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: hromadné přejmenováni
Sakr, no aby to fungovalo i natisíce souborů a i s mezerama a jinými zákeřnými znaky by to mělo být
for i in  ~/tmp/tmp-nm/*.xxx; do mv $i ${i%xxx}yyy; done
To s tím ls by mělo právě ten následek, že by přetekla příkazová řádka.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
28.7.2004 14:03 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: hromadné přejmenováni
Abych vysvětlil co je na tom scriptu špatně, tak tedy co se bude dít. Bash spustí svůj fork, který se pokusí vyhodnotit výraz 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 ...
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
28.7.2004 23:44 coques | skóre: 21 | blog: FailSystem
Rozbalit Rozbalit vše Re: hromadné přejmenováni
dakujem za vycerpavajuce vysvetlenie a ak som ta tym skriptikom zodvihol zo stolicky, tak prepac :-)
Polívčička byla..
29.7.2004 11:03 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: hromadné přejmenováni
To nic, ja tyhle veci v bashi nemám rád, protože pak se dotyčný divý proč mu to nebo ono nejede. Uznávám, že než se člověk na man stránce bashe zorientuje tak to chvilku trvá a než do toho pronikne, tak aby místo
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 <soubor
a 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
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
29.7.2004 17:07 coques | skóre: 21 | blog: FailSystem
Rozbalit Rozbalit vše Re: hromadné přejmenováni
dakujem, presne to som potreboval...

ale vyzera to teda zlozito :-)

btw, nevies mi dat link na nejaky handbook na bash ?
Polívčička byla..
30.7.2004 08:05 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: hromadné přejmenováni

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.

XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
28.7.2004 20:38 laco
Rozbalit Rozbalit vše Re: hromadné přejmenováni
Odpovědět | | Sbalit | Link | Blokovat | Admin
slackware 9.1

rename .ogg .mp3 *.ogg

specialne znaky (medzery, diakritika, ..) nie su problem
Jakub Hájek avatar 30.6.2006 21:23 Jakub Hájek | skóre: 14 | blog: zamek | Praha
Rozbalit Rozbalit vše Re: hromadné přejmenování
Odpovědět | | Sbalit | Link | Blokovat | Admin
Koukam, ze reseni je tu uz mnoho, tak take jedno prihodim...

ls *.ogg | sed 's/...$//'| xargs -i mv {}ogg {}mp3
Teprve tehdy, až nebudeme mít co ztratit, budeme opravdu svobodní.

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.