LINUX.ORG.RU

ренейм кучи файлов в вид 001.мп3 002.мп3


0

1

Приветствую! наскоро порыл гугля, но не нашёл решения под мою задачу. исходные: некоторые несознательные выпускатели аудиокниг именуют файлы в виде, например, 00_01_01.mp3 и даже ещё более жутко. аудиоплейер жены такое, бывает, совсем не по порядку воспроизводит, соотв слушать книгу - неевозможно. куски из произвольных мест получаються. пока ренеймую вручную, но это временами убиться можно - по 70 - 150 файлов... итого хорошо бы скриптик на баше, чтоб файлы по порядку ренеймились в вид 001.mp3 002.mp3 ..027.mp3 and so on. желательно с возможностью подстройки сортировки на входе -скажем по файлнейму, или по дате создания..? спасибо заранее.

#!/bin/sh
# this script wrote by Eddy 
#
#		batchrename - renames files like 01.ext, 02.ext ...
#
# Создан 17-го Июля 2003 года в 20:35
#   
#   format :  batchrename <list of files>
#        or:              -r <extension> <<list of files> or <dir>>
#   -r - recoursively
counter=0
extrec=""
if [ "$#" -lt "1" ]; then
    echo -e "\n\t\tUsage:\n\tbatchrename [opt]\nopt:"
    echo -e "-r <ext> <folder> (or file list) -- renames recoursively ALL files"
    echo -e "\tin folder <folder> (or by file list given)  with extension .<ext>"
    echo -e "<folder> -- renames ALL files in folder given"
    echo -e "<file list> -- renames ALL files of given filelist.\n\n"
    exit 0
fi
Name="$*"
if [ "$1" = "-r" ]; then
    extrec="$2"
    shift
    shift
    Name="$*"
    [ "$Name" = "" ] && Name="./"
fi
echo -e "\n\t\t\tRENAMING"

del_dup

for file in $Name
do
file=`echo "$file" | sed "s/<>/ /g"`
    if [ -d "$file" ];then
	echo -e "\nDiving into \033[38m $file \033[39m"
	cd "$file"
	if [ "$extrec" != "" ]; then
	    batchrename -r $extrec `ls -1 | sed "s/\ /<>/g"`
	else
	    batchrename `ls -1 | sed "s/\ /<>/g"`	
	fi
	cd ../
	continue
    fi
    ext=`ext "$file"`
    if [ "$ext" = "ion" ]; then
	continue
    fi
    if [ "$extrec" = "" -o "$ext" = "$extrec" ];then
        counter=`expr $counter + 1`
	echo -e "Progress: $counter files\r\c"
        mv "$file" "rnmd$counter.$ext"
    fi
done
echo -e "\n\n\t\t\tENDING"
digits=`echo $counter|awk '{print length ($0)}'`
cnt=1
while [ $digits -gt $cnt ]
do
    f=`ls -S -1|grep "rnmd[0-9]\{$cnt\}\."`
    rename rnmd rnmd0 $f
    cnt=`expr $cnt + 1`
done
if [ "$counter" -gt "0" ]; then
    rename rnmd "" rnmd*
fi
echo -e "\n\t\t\tDone !!!\n"
Eddy_Em ☆☆☆☆☆
()

>аудиоплейер жены такое, бывает, совсем не по порядку воспроизводит,

Это можно зависеть от порядка заливки.

zombiegrinder_6000
()

нашёл чудный оператор типа echo {001..100}
выдаёть рейндж с нужными нам числами - 001 002 003 004 и тдп.
только подставить в mv / rename /cp както никак его не получаеться.
при чём то подобном:
for i in `ls *.mp3`
do
u=`expr {001..010}`
cp $i $u.mp3
done

максима что можно добится - берёться только первое число ( 001).

а энтот скрипт:
ls *.mp3 | awk '{print «mv \»«$1»\" «NR».mp3"}' | /bin/sh

как я уже писал, ренеймит в форму типа 1.mp3 2.mp3 3.mp3
в то время, как надо 001.mp3 002.mp3 003.mp3
...:(

wisedraco ★★
() автор топика
#!/bin/bash

pref=1000
for i in *.mp3
do
    (( pref++ ))
    mv "$i" "${pref:1}.mp3"
done
TGZ ★★★★
()
Ответ на: комментарий от ss_ash

fix

# aptitude install pyrenamer

P.S. когда же будет возможность редактирования сообщений?

ss_ash ★★★
()
Ответ на: комментарий от anonymous

cnt=1
for i in `ls *.mp3`
do
u=`printf %03d $cnt`
cnt=`expr $cnt + 1`

cp $i $u.mp3
done

anonymous (28.03.2011 18:21:16)


Благодарствую, господин хорошый! скрипт работает.
покопаюсь на досуге по переменной, чтобы понять как сиё действует.
а на основе {001..200} решение сильно замороченней?

wisedraco ★★
() автор топика
Ответ на: комментарий от wisedraco

а на основе {001..200} решение сильно замороченней?

у конструкции {001..200} вывод разделен пробелами

echo {001..200} | tr ' ' \\n |                                                                                 
for i in `ls *.mp3`                                                                                            
do                                                                                                             
read u                                                                                                         
echo cp $i ${u}.mp3                                                                                            
done

а у seq вывод разделен новой строкой, т.е. немного проще, в данном случае

seq -w 0 200 |                                                                                               
for i in `ls *.mp3`                                                                                            
do                                                                                                             
read u                                                                                                         
echo cp $i ${u}.mp3                                                                                            
done

PS: число 200 лучше заменить на заведомо большее, чем кол-во mp3.
seq -w 0 200 |можно заменить на seq -w 1 0`ls *.mpg | wc -l` |

anonymous
()
Ответ на: комментарий от rival

getopt я только на сях использую, в баше он обычно не нужен. Да и скрипты у меня элементарные, зачем их getopt'ом уродовать?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от rival

Только сейчас обратил внимание на дату создания скрипта. Мда, уже больше семи лет ему, а я в его нутро и не заглядывал с момента написания. Страшный, конечно, можно было бы и упростить при помощи find и т.п.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

> Да и скрипты у меня элементарные, зачем их getopt'ом уродовать?

Почему сразу уродовать? По мне так вполне симпатично выглядит. Ну, дело твое.

rival ★★
()
your_sort input_list_of_mp3.txt | awk '{printf("mv \"%s\" %03d.mp3", $1,NR)}' | /bin/sh 
anonymous
()
your_sort input_list_of_mp3.txt | awk '{printf("mv \"%s\" %03d.mp3\n", $1,NR)}' | /bin/sh 

fixed

anonymous
()
Ответ на: комментарий от ZenitharChampion

Спасибо всем, кто помог. накопирую решения в файлик и буду думать -
что как работает.
не в первый раз, однако.
проблема в том, что такие решения и задачи редко попадаються -к тому
времени как очередная всплывает, я благополучно забываю что читал и
знал ко времени решения предыдущей проблемы скриптов на баше :)
ещё раз - большое спасибо!

wisedraco ★★
() автор топика
Ответ на: комментарий от wisedraco

Мне спасибо говорить не надо, надо вот им... А я дал скрипт как раз на обратное, на создание из обычных файлов - таких как у тебя.

ZenitharChampion ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.