Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Открыть новую тему     Написать ответ в эту тему

digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи вопрошающие! Если ваша система отлична от ГНУ, и в то же время вы желаете обойтись только дефолтными средствами, указывайте и то и другое сразу, пожалуйста.


UNIX Shell

 
   Это глобальная тема по юниксовой командной оболочке, как по интерактивной работе в командной строке, так и по шелл-скриптам. Ключевые слова: sh, bash, zsh, tcsh, busybox, readline, coreutils, cp, mv, ln, rm, ls, readlink, mkdir, touch, stat, date, test, sleep, chown, chmod, chattr, dd, df, du, env, echo, cat, less, man, grep, sort, findutils, find, locate, xargs, md5sum, cmp, diff, patch, ps, kill, killall, tar, gzip, bzip2, xz, mount, fdisk, parted, mkfs, fsck, e2fsprogs, mtools, ss, netcat, netstat, rsync, ssh, scp, sftp, lftp, ncftp, time, strace.
   Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.
   Смотри в других ветках: wget, convert, montage, mogrify и др., gs, git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit, kioclient.
 
 

Hint! Русские маны (подустаревшие, не всегда полные и не всегда для вашей системы) можно попытаться найти на Опеннете, к примеру: bash, tar, grep.

 
Готовые решения:
  • commandlinefu.com
    Крупнейшая база полезных однострочников на командной оболочке с ранжированием на основе пользовательского голосования.
     
  • shell-fu.org
    Аналогично, но поменьше и формат записей более свободный, поэтому встречаются и однострочники, и развернутые скрипты, и просто советы.
     
  • Useful one-line scripts for sed
    Почти исчерпывающий список решений для тех случаев, когда sed незаменим. Более сложные скрипты с sed.sf.net — только для тех, кто знает толк... :)

 
Учебная литература:
  • Greg’s Wiki (http://mywiki.wooledge.org)
    Наиболее обширный авторский сборник постоянно обновляющихся материалов по Башу.

    1. Bash Pitfalls
      (Частые ошибки программирования на Баше: [1], [2], [3], [4], [5] — пер. на русский по сост. на дек. 2008 г.).
      Рассмотрены преимущественно ошибки, возникающие из-за непонимания отличия шелла от «нормальных» скриптовых языков. Если вы уже владеете, например, Перлом, то это вполне может быть ваше первое руководство для ознакомления с Башем.
    2. Bash FAQ
    3. Bash Guide
    4. Bash Reference Sheet
      Шпаргалка по частым синтаксическим оборотам.

 
Классическая учебная литература:
С одной стороны не упомянуть эти издания нельзя, с другой — они настолько устарели, что едва ли их можно рекомендовать в роли учебника.

 

Смело правьте и дополняйте шапку, однако не забывайте отписываться об исправлениях и сохранять исходный вариант под #.
Первый пост темы имел вид...

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: qw12, 09:42 24-03-2020
DocBeen



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
kpp77
mp3="$(basename $f .mp3).mp3" - отделяю название файла, которое в последствии будет использоваться конвертером имя файла mp3 совпадает с именем файла разметки.
 
не совсем понял каким образом отделить название эпизода в названии файла с помощью

Цитата:
sed 's/^.*_\([0-9]*\)-.*$/\1/'

 
и как создать в цикле каталоги с этими цифрами

Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 13:30 19-09-2012
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DocBeen
Как предложил Alukardd, сделать лучше циклом:

Код:
for f in /path/to/folder/*.mp3
do
  mp3="${f}"  
  cue="$(basename ${mp3} .mp3).cue"  
 
  j=`echo "${mp3}" | sed 's/^.*_\([0-9]*\)-.*$/\1/'`
 
  mkdir ${j}  
  mp3splt -c ${cue} ${mp3} -d ${j}  
  rm ${mp3} ${cue}
done


Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 13:46 19-09-2012 | Исправлено: kpp77, 13:58 19-09-2012
DocBeen



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alukardd
kpp77
Огромное вам спасибо, все получилось как нельзя лучше.

Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 14:12 19-09-2012
DocBeen



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Справился с предыдущей задачей, но столкнулся вот еще с чем: в каталоге имеются куча музыкальных файлов с названиями вида: Автор - 01 - название композиции.mp3  
как возможно с помощью sed поменять слова местами так чтоб название файла приобрело вид: 01 - Автор - название композиции.mp3

Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 22:50 19-09-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DocBeen
Для этого нет смысла использовать связку bash + sed + mv, поскольку есть специально предназначенная для переименования по регэкспам утилита rename.
$ rename 's/^(.*?) - (.*?) -/$2 - $1 -/' *
 
Комментарии нужны?

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:13 19-09-2012 | Исправлено: ASE_DAG, 23:14 19-09-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DocBeen
Мне проще при помощи awk...
for f in *.mp3; do dst=$(echo "$f" | awk '{print $3,$2,$1,$4,$5;}'); mv "$f" "$dst"; done
Предварительно надо перейти в нужную директорию.
 
Добавлено:
ASE_DAG
Я как всегда. Так редко мне нужно выполнять подобные действия что об утилите rename я даже не помню.
Обычно мне всегда хватает mv /path/{old,new}

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 23:13 19-09-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> print $3,$2,$1,$4,$5;
Эм? Почему пять полей?

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:17 19-09-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Надо прокомментировать, что -n симулирует работу.
А зачем "?" после .*
 
Добавлено:
ASE_DAG
автор, номер, название и 2 дефиса :-D

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 23:18 19-09-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> об утилите rename я даже не помню
Нет, вы правы, парсить регэкспами строку которую следовало бы разбивать по разделителям ф-ей типа split() не очень правильно, просто в таком простом случае — не проблема. Но что вы написали — я так и не понял — вы же не переопределили разделитель, т. е. строка бьется по пробелам, так? Все-равно не понял.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:22 19-09-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
строка бьется по пробелам, так? Все-равно не понял.
вроде среда, а не пятница... 4 пробела = 5 подстрок.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 23:25 19-09-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> 4 пробела = 5 подстрок
Так там же их больше, причем неизвестное количество! Это не башевский read A B C D, который в $D запишет без разбиения все, что осталось до конца строки.
 
$ for f in *.mp3; do dst=$(echo "$f" | awk '{print $3,$2,$1,$4,$5;}'); echo "SRC: $f"; echo "DEST: $dst"; done
SRC: Автор - 01 - название композиции.mp3
DEST: 01 - Автор - название

 
Как видите-с ерунда выходит.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:33 19-09-2012 | Исправлено: ASE_DAG, 23:33 19-09-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Согласен. Хрень. Надо менять -F' - ' и оставлять только 3 поля.
for f in *.mp3; do dst=$(echo "$f" | awk -F' - ' -v OFS=' - ' '{print $2,$1,$3;}'); mv "$f" "$dst"; done
Всё я за rename в данной ситуации) Спать пора)

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 23:41 19-09-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DocBeen
Вот на чистом Баше, без rename’а, регэкспов и других write-only приемов.
 
$ IFS=' - '
$ for f in *.mp3; do read A B C <<< "$f"; mv -v "$f" "$B - $A - $C"; done

 
Добавлено:
Alukardd
> Надо менять -F' - ' и оставлять только 3 поля
И получаем ограничение на отсутствие ' - ' в названии композиции. Ага. ;-)

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:46 19-09-2012
DocBeen



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
От решений голова идет кругом, но ни одно не подходит
Я так понимаю название файла удобнее разделить на две части: та что до номера и та что после номера (до расширения) - при том разделить как раз таки " - " {пробел дефис пробел}
 
может поможет листинг части каталога:
 
Alexander Popov - 04 - When The Sun (Eximinds Remix) [Tune Of The Week].mp3
Armin van Buuren pres. Gaia - 21 - J'ai Envie De Toi.mp3
Ashley Wallbridge & Andy Moor feat. Gabriella - 06 - World To Turn.mp3
Ashley Wallbridge - 07 - Zorro.mp3
Ashley Wallbridge - 08 - Mumbai Traffic.mp3

Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 06:18 20-09-2012 | Исправлено: DocBeen, 06:19 20-09-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
получаем ограничение
конечно получаем
Цитата:
$ IFS=' - '  

Вы, кстати, мне так и не сказали, а зачем Вы использовали ленивый квантификатор, в данном случае это абсолютно всё-равно.
 
DocBeen
у?
Все предложенные нами решения рабочие, кроме моего самого первого, я там не учёл один факт. Остальные 3 решения в полном порядке.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 09:30 20-09-2012 | Исправлено: Alukardd, 09:30 20-09-2012
DocBeen



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Делаю скрипт:
 

Код:
 
#!/bin/sh
IFS=' - '
for f in *.mp3; do read A B C <<< "$f"; mv -v "$f" "$B - $A - $C"; done
 

 
при запуске ругается на синтаксическую ошибку в строке

Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 09:48 20-09-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DocBeen
#!/bin/bash же!

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 10:10 20-09-2012
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Предлагаю свой вариант:

Код:
#!/bin/sh
for f in *.mp3
do
  fn="`echo "${f}" | sed 's/^\(.*\) - \([0-9]*\) - /\2 - \1 - /'`"
  mv "${f}" "${fn}"
done
 

или

Код:
#!/bin/sh
for f in *.mp3
do
  eval mv `echo "${f}" | sed 's/^\(.*\) - \([0-9]*\) - \(.*\)$/\"&\" \"\2 - \1 - \3\"/'`
done

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 11:42 20-09-2012 | Исправлено: kpp77, 11:44 20-09-2012
DocBeen



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Все прекрасно работает - Огромное спасибо!!!

Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 11:42 20-09-2012 | Исправлено: DocBeen, 12:06 20-09-2012
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DocBeen
См. пост выше.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 11:52 20-09-2012
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru