The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
скриптец.. может пригодится кому..., !*! 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, 22:22 , 25-Авг-13 (1)
    Может, sort -n, --numeric-sort ?
  • скриптец.. может пригодится кому..., !*! ACCA, 01:27 , 26-Авг-13 (2)
    Вместо
    > char="1"

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


    cnt=1

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

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

    пиши


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

  • скриптец.. может пригодится кому..., !*! erera22, 18:48 , 26-Авг-13 (3)
    Вообще, когда создаете 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, 19:59 , 26-Авг-13 (4)
      >Может, 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, 20:45 , 26-Авг-13 (5)
        почти доделал, все работает но хотел бы чтобы он автоматически определял сколько цифр использовать для имени. думаю сделать так:
        #--------------------------------
        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, 20:54 , 26-Авг-13 (6)
          УРАА! :)
          слепил!

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

          #!/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, 00:28 , 27-Авг-13 (7)
          > написал скриптик который переименовывает по порядку от 1 до ХХХ..n

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

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

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

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

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

          Overengineering detected.

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

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

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





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

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