Здаров всем.:)
вот понадобилось сделать выборку мп3 файлов для заливки на плеер,
написал скриптик который переименовывает по порядку от 1 до ХХХ..n то что прочитает из указанного ему файла.
работает так:
./renall file leftname. .rightname.mp3
в результате если в file было:
/path/ooo asefw.la
/path/ooo wew.la
/path/sswew asefw.la
/path/123.la
это будет переименовано в:
/path/leftname.1.rightname.mp3
/path/leftname.2.rightname.mp3
/path/leftname.3.rightname.mp3
/path/leftname.4.rightname.mp3
#----------------------------------------
но облом в том что при выводе ls -la; или find ./ | sort; они выводятся не по порядку, т.е. так :
18.mp3
19.mp3
1.mp3
20.mp3
21.mp3
2.mp3
#-----------------------
вопрос как сделать чтоб выводился так:
1.mp3
2.mp3
18.mp3
19.mp3
20.mp3
21.mp3
#--------------------------------
сам скрипт:
#!/bin/bash
file=$1
left=$2
right=$3
char="1"#echo "TRAP_0"
_go0(){
if [ -e $file ]; then
end=`cat $file | wc -l`#------------------------------
string=`sed -n $char\p $file`
str=`echo $string| tr '/' "\n" | tail -n1`echo "[$string] to " "$left$char$right"
rename "$str" "$left$char$right" "$string"
while [ $char != $end ];
do
char=$(( $char + 1))
string=`sed -n $char\p $file`
str=`echo $string| tr '/' "\n" | tail -n1`echo "[$string] to " "$left$char$right"
rename "$str" "$left$char$right" "$string"
done
#------------------------------else
echo " -=file not found.=-\n"
echo "renall \"file\" \"left pattern\" \"right pattern\";
fi
}if [ $right ]; then _go0
else
echo "renall \"file\" \"left pattern\" \"right pattern\";
fi
Может, sort -n, --numeric-sort ?
Вместо
> char="1"сделай какой-нибудь
cnt=1использовать так - вместо
> string=`sed -n $char\p $file`
пиши
string=$( printf "%03i.%s" $cnt $file )
Вообще, когда создаете file, проще всего ls | sort -n > filename , ну или find . -type f | sort -n > filename.Или так:
#!/bin/bashfilename="$1"
prefix="$2"
postfix="$3"
begin=1function _go0_exit
{
echo "$1"
exit 1
}function _go0
{
test -e "$filename" || _go0_exit "Error: content file was not found"
num=$beginsort -n "$filename" | while read input
do
output="$prefix$num$postfix"
test ! -e "$output" -o -e "input" || continueecho "[$input] to $output"
mv "$input" "$output"let num=$num+1
done
}test $# -ge 3 || _go0_exit "Usage: $0 file prefix postfix"
_go0
exit 0Тут порядок задания имен в файле не важен.
>Может, sort -n, --numeric-sort ?пробовал не получается.
#-----------------------
>использовать так - вместо
> string=`sed -n $char\p $file`
>пиши
>string=$( printf "i.%s" $cnt $file )вставил в скрипт - не получилось, пытается дать rename этy строку
001.00 leftright 001.00
но это то что надо.осталось только понять и переделать :) чем и займусь.
благодарю :)
#----------------------------------
> Вообще, когда создаете file, проще всего ls | sort -n > filename
> , ну или find . -type f | sort -n >
> filename.
> Или так:
> mv "$input" "$output"создавать мне не нужно, и переименовывать через mv тоже, зачем перекидывать весь файл ради смены имени? , но может я и не понял чего, поэксперементирую с примером.
#------------------------------------
почти доделал, все работает но хотел бы чтобы он автоматически определял сколько цифр использовать для имени. думаю сделать так:
#--------------------------------
if [ -e $file ]; then
end=`cat $file | wc -l` # узнаем сколько всего файлов, например 331
endnum=`printf $end | wc -c` # узнаем сколько цифр в числе 331, т.е. выдаст "3"echo "--------------[$endnum]-----------"
test=$( printf "%05i%s" $char ) #вот тут количество цифр в выводе задано жестко
echo "--------------[$test]-----------"
test=$( printf "%???i%s" $char ) #как заменить "05" на переменную ?вариант test=$( printf "%$endnumi%s" $char ) не работает...
УРАА! :)
слепил!рабочий вариант:
#!/bin/bash
file=$1
left=$2
right=$3
char="1"#echo "TRAP_0"
_go0(){
if [ -e $file ]; then
end=`cat $file | wc -l`
endnum=`printf $end | wc -c`#------------------------------
string=`sed -n $char\p $file`
str=`echo $string| tr '/' "\n" | tail -n1`
outchar=$( printf "%0$endnum""i%s" $char )echo "[$string] to " "$left$outchar$right"
rename "$str" "$left$outchar$right" "$string"
#echo "$str" "$left$outchar$right" "$string"while [ $char != $end ];
do
char=$(( $char + 1))
string=`sed -n $char\p $file`
str=`echo $string| tr '/' "\n" | tail -n1`
outchar=$( printf "%0$endnum""i%s" $char )echo "[$string] to " "$left$outchar$right"
rename "$str" "$left$outchar$right" "$string"
#echo "$str" "$left$outchar$right" "$string"
done
#------------------------------else
echo " -=file not found.=-\n"
echo "renall \"file\" \"left pattern\" \"right pattern\";
fi
}if [ $right ]; then _go0
else
echo "renall \"file\" \"left pattern\" \"right pattern\";
fi
> написал скриптик который переименовывает по порядку от 1 до ХХХ..n$ man rename;
$ man mmv (но оно не у всех есть)> почти доделал, все работает но хотел бы чтобы он автоматически определял сколько
> цифр использовать для имени.Количество цифр в числе равно количеству раз, которое можно делить на основание системы счисления.
for ((x=311, k=0; x > 0; x=x/10)) do ((k++)); done;
> почти доделал, все работает но хотел бы чтобы он автоматически определял сколько
> цифр использовать для имени. думаю сделать так:Overengineering detected.
Вот смотри, переименовал ты один каталог файлов, насчитал и заюзал 2 цифры.
Завтра ты переименовывал другой каталог, в нём юзал 3 цифры.Послезавтра ты решил слить всё в кучу и опять получил кривую сортировку.
Вломи 6 цифр и не морочь голову ни себе ни людям.