Inkrementální přejmenování souborů v řádce

Pavouk106

  • *****
  • 2 399
    • Zobrazit profil
    • Můj blog
    • E-mail
Inkrementální přejmenování souborů v řádce
« kdy: 09. 01. 2012, 17:18:12 »
Ahoj,

už několikrát jsem řešil, jak přejmenovat více souborů v jednom adresáři na nový vzor jména zakončený přibývajícím číslem a koncovkou.

Mám v jednom adresáři řekněme 20 fotek (a nic víc, žádné jiné soubory) a chci, aby se jmenovaly foto01.jpg, foto02.jpg, .... až do foto20.jpg

K dispozici mám standardní funkce řádky, žádný speciál prográmek k tomu určený. Předpokládal bych použití for cyklu v kombinaci s ls a něčím k samotnému přejmenování (tedy to je moje domněnka, finální příkaz je mi jedno jak bude vypadat :-) ). Dohromady to ale sám dát nedokážu a věřím, že někdo jiný už to zkoušel a má vymyšlené :-)

Podělte se prosím o vědomost a poraďte mi, jak na to nejjednodušeji.

Předem díky za nápady


cita

Re:Inkrementální přejmenování souborů v řádce
« Odpověď #1 kdy: 09. 01. 2012, 17:43:36 »
nic vlastniho bych nepsal a pouzil bych todle:
http://linuxcommand.org/man_pages/logrotate8.html

Pavouk106

  • *****
  • 2 399
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Inkrementální přejmenování souborů v řádce
« Odpověď #2 kdy: 09. 01. 2012, 18:00:26 »
cita: Zajímavá myšlenka. Nehodil bys sem konkrétní příklad? Nějak to nejsem schopnej z manuálu vyčíst... S logrotate jsem zatím nepracoval.

nikdo

Re:Inkrementální přejmenování souborů v řádce
« Odpověď #3 kdy: 09. 01. 2012, 19:37:38 »
Určitě existuje nějaký jednodušší / efektivnější / rychlejší / univerzálnější / správnější postup, ale já si zatím vždy vystačil s něčím takovým:

Kód: [Vybrat]
i=1 ; for f in *.jpg ; do echo mv $f "foto"`printf %02d $i`".jpg" ; i=$((i+1)) ; done
Po kontrole, zda to dělá, co má odstranit echo.

Nefunguje na soubory s mezerama. Jinak jsem nějakou dobu úspěšně používal http://www.infinicode.org/code/pyrenamer/ (klikací).

Tomas

Re:Inkrementální přejmenování souborů v řádce
« Odpověď #4 kdy: 09. 01. 2012, 19:38:55 »
Kód: [Vybrat]
#!/bin/zsh
i=1; for f in * ; do  mv "$f" foto$(printf '%02d' $i).jpg ; i=$((i+1)) ; done


XXX

Re:Inkrementální přejmenování souborů v řádce
« Odpověď #5 kdy: 09. 01. 2012, 20:16:01 »
Trochu komplexnejsi reseni :)... Napsano primo pro Tebe :).

rename.sh
Kód: [Vybrat]
#!/usr/bin/env bash

###############################################################################
###  SETTINGS  ################################################################
###############################################################################

DIR="./fotky";
PREFIX="foto";
NUM_LENGTH=2; # 1=>{0,..,9}; 2=>{00,..,99}, ...
EXT=".jpg";
FILTER="*.jpg";

###############################################################################

NUM_MAX=`echo "10^${NUM_LENGTH}" | bc`;
NUM=${1};

get_num() {
num=${NUM};
while [ ${#num} -lt ${NUM_LENGTH} ]; do
num="0${num}";
done
}

if [ X"${NUM}" == X ]; then
NUM=1;
./${0} ${NUM};
elif [ X"${1}" == X"${NUM_MAX}" ]; then
echo "Limit reached! Limit = ${NUM_MAX}";
exit 1;
else
pushd ${DIR} >/dev/null;
file=`ls ${FILTER} | grep -v "${PREFIX}" | head -n 1`;
if [ X"${file}" == X ]; then
echo "Finish!";
exit;
fi
get_num;
echo "renaming: ${file} -> ${PREFIX}${num}${EXT}";
mv ${file} ${PREFIX}${num}${EXT};
(( NUM++ ));
popd >/dev/null;
./${0} ${NUM}
fi

Pavouk106

  • *****
  • 2 399
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Inkrementální přejmenování souborů v řádce
« Odpověď #6 kdy: 10. 01. 2012, 10:46:00 »
Super, díky za ohlasy :-)

Řešení, který předvedl "nikdo" se mi zamlouvá pravděpodobně nejvíc. Tomas to pak ještě upravil, ale nejsem schopnej říct jak/proč.

Dokonce to řešení použiju už na muj for, kde fotky zmenšuju, takže to fotku zmenší a hned i přejmenuje ;-)

V brzký době (dneska) to vyzkouším a případně sem hodím jak to dopadlo :-)

Díky

Mordae

Re:Inkrementální přejmenování souborů v řádce
« Odpověď #7 kdy: 10. 01. 2012, 11:38:25 »
Tomas to upravil tak, aby to neslitlo na souborech s mezerama.

Pavouk106

  • *****
  • 2 399
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Inkrementální přejmenování souborů v řádce
« Odpověď #8 kdy: 10. 01. 2012, 12:58:11 »
Mordae: Díky, vynikající. Díky všem za nápady a za pomoc

XXX

Re:Inkrementální přejmenování souborů v řádce
« Odpověď #9 kdy: 10. 01. 2012, 14:25:24 »
A na moje reseni ses ani nepodival? :( ... Tak jsem se s tim zbytecne paral celou hodinu :(.

Pavouk106

  • *****
  • 2 399
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Inkrementální přejmenování souborů v řádce
« Odpověď #10 kdy: 10. 01. 2012, 17:19:11 »
XXX: Podíval. Jen se obávám, že to nedokážu (zatim) docenit. Moje znalosti jsou řekněme mizivé... Ale mrknu na něj, až bude chvíli čas a pokusím se to rozebrat a pochopit ;-) Rád vím, co se přesně provádí, abych to pak dokázal pochopit a případně vytvořit příště podobnou věc sám. Na Tvoje řešení zatím znalostně prostě nemám, takže ho zatím odsouvám a vrátím se k němu, až budu dál. To si do něj pak dobastlím ještě zmenšování fotek a je možné že ho udělám ještě obecnějším ;-) I Tobě díky za Tvůj příspěvek