Показаны сообщения с ярлыком cygwin. Показать все сообщения
Показаны сообщения с ярлыком cygwin. Показать все сообщения

понедельник, 18 июня 2012 г.

Cygwin: Делаем немыслимые вещи

Немыслимо интересные вещи на bash (кое-что и на Cygwin неплохо работает). На случай, если сайт слетит (Web 1.0, что поделать) - сохраните у себя.

Перепостил бы целиком, но Linux-ом пока не пользуюсь.

вторник, 8 мая 2012 г.

Script: Скриптовая эволюция

Дано - написать скрипт, который кидает определённые файлы из локальной папки в папку на подключенном сетевом диске. Например, веб-проект, в котором мы изменили 2-3 dll. OS Windows.

На каком языке писать скрипт?

ActivePerl под Windows - иногда не принимает переданных параметров
Cygwin - нету
PowerShell - просто так даже Hello World не запустишь. Система будет ругаться, что он... не подписан (маразм? маразм!)

Похоже, технологии ушли слишком далеко. Нам остаётся только старый формат CMD файлов.

copydll.cmd:

@echo off
set FROM=d:\proj1\bin
set TO=W:\stable\proj1\bin
FOR %%A IN (%*) DO IF EXIST "%FROM%\%%A.dll" COPY /Y "%FROM%\%%A.dll" "%TO%\%%A.dll"

Добавляем папку в Path и вызываем

copydll Proj.Module1 Proj.Module2

А этот cmd можно кинуть на панель в Total Commander и просто перетаскивать туда нужный файл:

@echo off
set TO=W:\stable\proj1\bin
FOR %%A IN (%*) DO IF EXIST %%A COPY /Y %%A "%TO%\%%~nxA"

Конечно, можно просто перетащить на панель Total Commander'а саму папку, но тогда придётся дважды щёлкать мышкой (ОК в диалоге копирования и потом Replace All)

Да, ещё. Если написать в CMD-шке PAUSE, она в этом месте попросит Press any key to continue....

суббота, 28 апреля 2012 г.

Cygwin: grep взбунтовался?

Интересные вещи творятся в GNU grep 2.5.4. С мест сообщают - grep -o - тормозит как неизвестно что.


Поэтому надо писать так:


gawk '{match($0, "REGEXP") ; if (RSTART) print substr($0, RSTART, RLENGTH);}'


А желающие могут сравнить:

#!/bin/sh
for x in {1..10000} ; do echo {a..z} @where=gdetotam@ {a..z}{a..z} ; done > tmp.txt
export LC_ALL=C
time cat tmp.txt | grep -o "@where=[^@]\+@" > /dev/null #медленно, 2 секунды
time cat tmp.txt | grep "@where=[^@]\+@" > /dev/null #быстро, 0.1 секунды
time cat tmp.txt | awk '{match($0, "@where=[^@]+[@]") ; if (RSTART) print substr($0, RSTART, RLENGTH);}' > /dev/null
На моём Cygwin с grep 2.5.1 - всё ОК.

Cygwin: Ловим ошибки

Не забываем добавлять в начало bash-скрипта (сразу после адреса):

set -euo pipefail

чтобы увидеть ошибки в коде, переменных и пайпах.

А вот ошибки в функциях нам так и не покажут.

Cygwin: Резервное копирование

Умеренно универсальный скрипт для резервного копирования. На входе - директория. Можно добавить дополнительные параметры. На выходе - она же, запакованная в tar.gz.

#!/bin/sh
BackUpDir="/cygdrive/D/Backup"
if ([ $1 ]) then
  BackUpDir=$1
fi
if ([ ! -d $BackUpDir ]) then
  mkdir -pv $BackUpDir
fi
if ([ $2 ]) then
 if ([ -d $2 ]) then
  From=$2
 else
  From=`dirs`
 fi
fi
ArchiveName="$BackUpDir/"`date +"%d.%m.%y(%H.%M)"``echo "$From" | sed 's!^\(/\?.*\)*/\(.*\)/\?$!\2!g'`".tar"
tar -cf "$ArchiveName" *
gzip $ArchiveName

Cygwin: Лучше, чем у Лекса Кравецкого

Во время оно lex-kravetski был не только коммунистом, но ещё и программистом. Например, написал большой пост о том, как конвертировать wav в mp3 консольным конвертером и 2 BAT-файлами.

При всем нашем уважении к пакетным файлам, то же самое на cygwin выглядит не в пример лучше, лаконичней и помещается в 1 скрипт:

#!/bin/sh
LameDir="C:/lame"
if ([ $1 ]) then
 Artist="$1"
else
 echo -n "Artist="
 read Artist
fi
if ([ $2 ]) then
 Genre="$2"
else
 echo -n "Genre="
 read Genre
fi
CurrentDir=`dirs`
ParamAlbum=`echo $CurrentDir | sed 's!^\(/\?.*\)*/\(\([0-9]\{4\}\)[ -]\+\)\?\(.*\)$!--ty "\3" --tl "\4"!g'` #RegExp: ^(/.*)*/(([0-9]{4})[ -]+)?(.*)$
for filename in *.wav
do
  FileShortName=`echo $filename | sed 's!\^(.*\).wav$!\1!g'` #RegExp: ^(.*).wav$
  ParamTrack=`echo $FileShortName | sed 's!^\([0-9]\{2\}\)[ -.]\+\(.*\)!--tn "\1" --tt "\2"!g'` #RegExp: ^([0-9]{2})[ -.]+(.*)
  echo "$LameDir/lame.exe -V2 \"$CurrentDir/$FileShortName.wav\" \"$CurrentDir/$FileShortName.mp3\" --pad-id3v2 --ta=\"$Artist\" $ParamAlbum $ParamTrack --tg=\"$Genre\""
done

Как использовать?
  1. Сохраняем скрипт в нашу директорию со скриптами под именем tomp3 (или ещё каким-нибудь). Во второй строке указываем директорию, куда мы распаковали Lame.
  2. Копируем файлы с CD в wav в таком виде:

    2009 - Album / 01 - Song.wav

    Или в другом:

    Album/01 - Song with a long-ling name.wav

    (год может быть и пустым)

  3.  Открываем cygwin И переходим в папку с Wav-ками
  4. Набираем SH ~/tomp3 "Artist" "Genre". Если без них - скрипт сам спросит.
  5. После завершения кодирования: rm *.wav
  6. И quit
К сожалению, скрипта с подсветкой синтаксиса для bash-скриптов у меня нет. Поэтому я подсветил как brush:perl. Получилось ярко и доступно.