Portál AbcLinuxu, 14. července 2025 04:02


Dotaz: Hromadne prejmenovani vsech souboru

Pavel V. avatar 29.9.2006 14:26 Pavel V. | skóre: 22 | Pardubice
Hromadne prejmenovani vsech souboru
Přečteno: 350×
Odpovědět | Admin
V jedne slozce mam spoustu ruznych souboru treba mp3, ogg, jpg, png a vsem temto souborum bych chtel zmenit nazev na ciselnou podobu.
Např.: 001.mp3, 002.ogg, 003.jpg, 004.png
Neco uz jsem dal dohromady:
#! /bin/sh
let N=0
for i in *.*
do
mv $i $(printf %03d $N).$promenna
let N+=1
done
exit
Ale chybi mi tam radek ktery mi vypreparuje koncovku kazdeho souboru a ulozi mi jej do $promenna
Nevite nekdo jak na to? Nebo nemate nekdo nejake reseni?
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

29.9.2006 14:36 Pavel1 | skóre: 33
Rozbalit Rozbalit vše Re: Hromadne prejmenovani vsech souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Třeba takto:
promenna="${i##*.}"   # od zacatku odstrani vse po posledni tecku
Pavel V. avatar 29.9.2006 14:40 Pavel V. | skóre: 22 | Pardubice
Rozbalit Rozbalit vše Re: Hromadne prejmenovani vsech souboru
Dekuji. :-)
Vysledny script:
#! /bin/sh

let N=0
for i in *.*
do
k="${i##*.}"
mv $i $(printf %03d $N).$k
let N+=1
done
exit
29.9.2006 14:54 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Hromadne prejmenovani vsech souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Málem jsem to spustil ve svém domovském adresáři :-)
Raději nechám poslední řádek zakomentovaný.
#!/usr/bin/env python
import os
for number, name in enumerate(os.listdir('.')):
    base, ext = os.path.splitext(name)
    newname = '%03d%s' %(number, ext)
    print name, newname
    #os.rename(name, newname)
Jo a v tom shellovském řešení by se měly doplnit nějaké uvozovky, aby to zvládlo i soubory s mezery v názvu (písničky a filmy to tak občas mívají).
Pavel V. avatar 29.9.2006 15:26 Pavel V. | skóre: 22 | Pardubice
Rozbalit Rozbalit vše Re: Hromadne prejmenovani vsech souboru
Tedy:
#! /bin/sh

let N=0
for i in *.*
do
k="${i##*.}"
mv "$i" $(printf %02d $N).$k
let N+=1
done
Dalibor Smolík avatar 29.9.2006 16:07 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: Hromadne prejmenovani vsech souboru
Já jsem to ještě vylepšil o vytvoření podadresáře, kam se umístí přejmenované soubory, takže ty s původním názvy jsou beze změn, což se může hodit :-)
#! /bin/sh
#vysledek se zapise do podadresre ./output, pokud neni, tak se vytvori

if [ ! -d "./output" ];
    then mkdir ./output
fi

cp *.* ./output;
cd ./output;
let N=0
for i in *.*
do
k="${i##*.}"
mv "$i" $(printf %02d $N).$k
let N+=1
done

Rozdíly v řeči a ve zvyklostech neznamenají vůbec nic, budeme-li mít stejné cíle a otevřená srdce.
29.9.2006 16:49 Pavel1 | skóre: 33
Rozbalit Rozbalit vše Re: Hromadne prejmenovani vsech souboru
Tady to furt někdo vylepšuje, tak já to taky zkusím:
#! /bin/bash
# soubory podle masky *.* ocisluje (od 0) a nakopiruje do adresare output

mkdir -p output
for i in *.*; do
  cp "$i" "output/$((n++)).${i##*.}"
done
29.9.2006 17:49 Pavel1 | skóre: 33
Rozbalit Rozbalit vše Re: Hromadne prejmenovani vsech souboru
To předešlé řešení nedoplňuje před jméno (číslo) nuly, toto už ano; otázka je, jestli se to dá brát ještě za zjednodušení (i co do přehlednosti)? Pravda je, že nevolám další shell (s printf) :
#! /bin/bash
# soubory podle masky *.* ocisluje (od 0) a nakopiruje do adresare output

mkdir -p output
for i in *.*; do
  s=000$[n++]
  cp "$i" "output/${s:${#s}-3:3}.${i##*.}"
done
29.9.2006 16:55 fakenickname | skóre: 42 | blog: fakeblog
Rozbalit Rozbalit vše Re: Hromadne prejmenovani vsech souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
A nešlo by to nějak přímo pomocí příkazu 'rename' ? .. ale třeba jen kecám..

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.