The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"скриптец.. может пригодится кому..."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"скриптец.. может пригодится кому..."  +/
Сообщение от cmd4 email on 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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "скриптец.. может пригодится кому..."  +/
Сообщение от Raven77 email(ok) on 25-Авг-13, 22:22 
Может, sort -n, --numeric-sort ?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "скриптец.. может пригодится кому..."  +/
Сообщение от ACCA (ok) on 26-Авг-13, 01:27 
Вместо
> char="1"

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


cnt=1

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

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

пиши


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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "скриптец.. может пригодится кому..."  +/
Сообщение от erera22 email(ok) on 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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "скриптец.. может пригодится кому..."  +/
Сообщение от cmd4 email on 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 тоже, зачем перекидывать весь файл ради смены имени? , но может я и не понял чего, поэксперементирую с примером.
#------------------------------------

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "скриптец.. может пригодится кому..."  +/
Сообщение от cmd4 email on 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 ) не работает...

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "скриптец.. может пригодится кому..."  +/
Сообщение от cmd4 email on 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

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "скриптец.. может пригодится кому..."  +/
Сообщение от pavlinux (ok) on 27-Авг-13, 00:28 
> написал скриптик который переименовывает по порядку от 1 до ХХХ..n

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

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

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

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

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

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

Overengineering detected.

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

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

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


Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру