URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9727
[ Назад ]

Исходное сообщение
"скриптец.. может пригодится кому..."

Отправлено cmd4 , 25-Авг-13 20:00 
Здаров всем.:)
вот понадобилось сделать выборку мп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


Содержание

Сообщения в этом обсуждении
"скриптец.. может пригодится кому..."
Отправлено Raven77 , 25-Авг-13 22:22 
Может, sort -n, --numeric-sort ?

"скриптец.. может пригодится кому..."
Отправлено ACCA , 26-Авг-13 01:27 
Вместо
> char="1"

сделай какой-нибудь


cnt=1

использовать так - вместо

> string=`sed -n $char\p $file`

пиши


string=$( printf "%03i.%s" $cnt $file )


"скриптец.. может пригодится кому..."
Отправлено erera22 , 26-Авг-13 18:48 
Вообще, когда создаете file, проще всего ls | sort -n > filename , ну или find . -type f | sort -n > filename.

Или так:
#!/bin/bash

filename="$1"
prefix="$2"
postfix="$3"
begin=1

function _go0_exit
{
   echo "$1"
   exit 1
}

function _go0
{
   test -e "$filename" || _go0_exit "Error: content file was not found"
   num=$begin

   sort -n "$filename" | while read input
   do
      output="$prefix$num$postfix"
      test ! -e "$output" -o -e "input" || continue

      echo "[$input] to $output"
      mv "$input" "$output"

      let num=$num+1
   done
}

test $# -ge 3 || _go0_exit "Usage: $0 file prefix postfix"
_go0
exit 0

Тут порядок задания имен в файле не важен.


"скриптец.. может пригодится кому..."
Отправлено cmd4 , 26-Авг-13 19:59 
>Может, 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 тоже, зачем перекидывать весь файл ради смены имени? , но может я и не понял чего, поэксперементирую с примером.
#------------------------------------


"скриптец.. может пригодится кому..."
Отправлено cmd4 , 26-Авг-13 20:45 
почти доделал, все работает но хотел бы чтобы он автоматически определял сколько цифр использовать для имени. думаю сделать так:
#--------------------------------
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 ) не работает...


"скриптец.. может пригодится кому..."
Отправлено cmd4 , 26-Авг-13 20:54 
УРАА! :)
слепил!

рабочий вариант:

#!/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


"скриптец.. может пригодится кому..."
Отправлено pavlinux , 27-Авг-13 00:28 
> написал скриптик который переименовывает по порядку от 1 до ХХХ..n

$ man rename;
$ man mmv (но оно не у всех есть)

> почти доделал, все работает но хотел бы чтобы он автоматически определял сколько
> цифр использовать для имени.

Количество цифр в числе равно количеству раз, которое можно делить на основание системы счисления.

for ((x=311, k=0; x > 0; x=x/10)) do ((k++)); done;


"скриптец.. может пригодится кому..."
Отправлено ACCA , 04-Сен-13 07:51 
> почти доделал, все работает но хотел бы чтобы он автоматически определял сколько
> цифр использовать для имени. думаю сделать так:

Overengineering detected.

Вот смотри, переименовал ты один каталог файлов, насчитал и заюзал 2 цифры.
Завтра ты переименовывал другой каталог, в нём юзал 3 цифры.

Послезавтра ты решил слить всё в кучу и опять получил кривую сортировку.

Вломи 6 цифр и не морочь голову ни себе ни людям.