Есть скрипт для транслитерации:
#!/bin/bashshopt -s nullglob
for NAME in /home/samba/fileserver/public/* ; do
TRS=`echo $NAME | sed "y/абвгґдеёжзиыійклмнопрстуфц/abvhgdeegzyyijklmnoprstufc/"`
TRS=`echo $TRS | sed "y/АБВГҐДЕЁЖЗИЫІЙКЛМНОПРСТУФЦ/ABVHGDEEGZYYIJKLMNOPRSTUFC/"`
TRS=${TRS//ї/ji}; TRS=${TRS//Ї/JI}
TRS=${TRS//є/ye}; TRS=${TRS//Є/YE}
TRS=${TRS//ж/zh}; TRS=${TRS//Ж/ZH}
TRS=${TRS//ч/ch}; TRS=${TRS//Ч/CH}
TRS=${TRS//х/kh}; TRS=${TRS//Х/KH}
TRS=${TRS//ш/sh}; TRS=${TRS//Ш/SH}
TRS=${TRS//щ/sch}; TRS=${TRS//Щ/SCH}
TRS=${TRS//ю/yu}; TRS=${TRS//Ю/YU}
TRS=${TRS//я/ya}; TRS=${TRS//Я/YA}
TRS=${TRS//э/ye}; TRS=${TRS//Э/YE}
TRS=${TRS//ъ/}; TRS=${TRS//Ъ/}
TRS=${TRS//ь/}; TRS=${TRS//Ь/}
TRS=${TRS//\ /_}; TRS=${TRS//\"/}
TRS=${TRS//\:/}; TRS=${TRS//\;/}
TRS=${TRS//\!/}; TRS=${TRS//\?/}
TRS=${TRS//\@/}; TRS=${TRS//\$/}
TRS=${TRS//\%/}; TRS=${TRS//\^/}
TRS=${TRS//\~/}; TRS=${TRS//\*/}
if [[ `file -b "$NAME"` == directory ]]; then
mv -v "$NAME" "$TRS"
cd "$TRS"
"$0"
cd ..
else
mv -v "$NAME" "$TRS"
fi
donecron на Debian wheezy без проблем его отрабатывает
cron на Debian etch не может отработать.
cron на последнем cygwin под Win7 аналогично etch. Логи при этом следующие:
sed: -e expression #1, char 82: strings for `y' command are different lengths
sed: -e expression #1, char 82: strings for `y' command are different lengths
'/cygdrive/c/Test/\320\256 \320\257 \320\255 \321\227' -> ''
mv: cannot move '/cygdrive/c/Test/\320\256 \320\257 \320\255 \321\227' to '': No such file or directoryКрон выглядит так (cygwin):
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.PmvD1zZzC7 installed on Tue Nov 4 10:57:51 2014)
# (Cron version V5.0 -- $Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp $)
PATH=/usr/local/bin:/usr/bin:/bin:$PATH
*/1 * * * * /bin/bash /cygdrive/c/Tasks/Translit.shПока в качестве костыля под cygwin пользую из виндового шедулера:
C:\cygwin\bin\bash.exe -l -c "/cygdrive/c/Tasks/Translit.sh"Вручную скрипт отрабатывает без проблем.
Есть подозрения на то, что крон не понимает переменные $NAME и $TRS
Как обойти сию проблему?
зачем транслитерировать последовательности различной длинны ?
так подойдет ?for NAME in /tmp/a.temp/* ; do
TRS=`echo $NAME | sed \
'{
y/абвгґдеёжзиыійклмнопрстуфц/abvhgdeegzyyijklmnoprstufc/
y/АБВГҐДЕЁЖЗИЫІЙКЛМНОПРСТУФЦ/ABVHGDEEGZYYIJKLMNOPRSTUFC/
s/ї/ji/g
s/Ї/JI/g
s/є/ye/g
s/Є/YE/g...........
}'`и да, локаль тоже нелишне в скрипте выставить.
> последовательности различной длинны ?Как понимать?
> Как обойти сию проблему?Самбу настроить.
>> Как обойти сию проблему?
> Самбу настроить.Каким боком к данному вопросу относится самба?
> Каким боком к данному вопросу относится самба?Оу, даже так. Ну тогда расскажи пожалуйста, для чего нужен этот скрипт?! :D
Что делает - я вижу, транслитерацию, а вот для чего?
> cron на Debian wheezy без проблем его отрабатываетДаже вроде работал.
> Даже вроде работал.?! =)
>> Каким боком к данному вопросу относится самба?
> Оу, даже так. Ну тогда расскажи пожалуйста, для чего нужен этот скрипт?!
> Что делает - я вижу, транслитерацию, а вот для чего?У меня самба везде одинаково настроена (как на новых, так и на старых серверах). ЮЮЦП вполне себе может работать и без самбы и никак оба этих пакета один от другого не зависят. Если бы в путях не указал самбу, то вы бы и не знали, что там она используется.
Если есть конкретные предложения, то пишите, а писать о каких-то сферических настройках линукса в целом не надо. Я сам знаю, что где-то что-то надо настроить, потому и спросил здесь, ЧТО и ГДЕ именно!
> Я сам знаю, что где-то что-то надо настроить, потому и спросил здесь, ЧТО и ГДЕ именно!О да, великий гуру! Даже, пля, локаль в системе, иль хотя бы в скрипте настроить них...я не умеем, а уже пальцы гнём. :D
Раз дело в кроне, (в ручную запускается) я тоже думаю дело в переменных: $NAME $TRSкрону не передаются эти переменные, для того что бы передавались их нужно в общих дефолтных настройках экспортировать
> в общих дефолтных настройках экспортироватьУ меня подобная проблема была со скриптом проверки температуры дисков утилитой hddtemp. Вручную отрабатывался, а кроном никак. Решил проблему явным указанием пути к бинаринку (whereis):
/usr/sbin/hddtemp
Здесь несколько иная переменная и мне не совсем понятно как правильно ее явно указать.
:)
>> в общих дефолтных настройках экспортировать
> У меня подобная проблема была со скриптом проверки температуры дисков утилитой hddtemp.
> Вручную отрабатывался, а кроном никак. Решил проблему явным указанием пути к
> бинаринку (whereis):
> /usr/sbin/hddtemp
> Здесь несколько иная переменная и мне не совсем понятно как правильно ее
> явно указать.если в ручную скрипт запускается, значит в профиле у тебя эти переменные уже прописаны, выполни комманды:
env | grep TRS
env | grep NAMEтебе эти переменные нужно прописать в общем профиле, и что бы пути постоянно не прописывать посмотри на тех серверах где не прописываешь и настрой переменную PATH, тоже в общем профиле.
Прописывать нужно примерно в файлах /etc/bashrc /etc/profile более точно тебе виднее зависит от того какая система, какой шел используешь
У меня нет этих переменных где-то конкретно прописанных. Грепнуть тоже не удается, потому как ничего нет. Разве что NAME выдает всевозможные ненужные результаты
env | grep NAME
USERNAME=root
LOGNAME=root
Ну а система Debian wheezy, bash 4.2P.S.
В принципе этих переменных и не должно негде быть прописано, иначе любые скрипты со своими переменными со временем напрочь бы захламили систему под корень. Переменная создается исключительно на время выполнения скрипта
> sed: -e expression #1, char 82: strings for `y' command are different lengths
> /АБВГҐДЕЁЖЗИЫІЙКЛМНОПРСТУФЦ/ABVHGDEEGZYYIJKLMNOPRSTUFC/"`
>В левой половине мультибайтные символы (57 байт), справа однобайтные ASCII (23 байта) И как >тебе компьютер должен сопоставить массивы разной длины?Тебе верно написали. NAME и TR у тебя в самом скрипте определяются вот их и нет в env.
:)
> :)Как сообщение пишешь, что бы только в почту падало, тут не отображалось? :)
> :)Ты же кажись как-то такой же хернёй занимался, у пациента неверная кодировка файла и/или лэнг криво выставлен?
>> :)
> Ты же кажись как-то такой же хернёй занималсяhttp://www.opennet.me/openforum/vsluhforumID9/9656.html
> у пациента неверная кодировка файла и/или лэнг криво выставлен?
поциента пытается сравнить два массива разной длины.
в одной 4-байтные символы, в другой обычный ASCII$ echo -n "АБВГҐДЕЁЖЗИЫІЙКЛМНОПРСТУФЦ" | wc -c
52
$ echo -n "ABVHGDEEGZYYIJKLMNOPRSTUFC" | wc -c
26$ echo -n "АБВГҐДЕЁЖЗИЫІЙКЛМНОПРСТУФЦ" | od -x
0000000 90d0 91d0 92d0 93d0 90d2 94d0 95d0 81d0
0000020 96d0 97d0 98d0 abd0 86d0 99d0 9ad0 9bd0
0000040 9cd0 9dd0 9ed0 9fd0 a0d0 a1d0 a2d0 a3d0
0000060 a4d0 a6d0
0000064
$ echo -n "ABVHGDEEGZYYIJKLMNOPRSTUFC" | od -x
0000000 4241 4856 4447 4545 5a47 5959 4a49 4c4b
0000020 4e4d 504f 5352 5554 4346
0000032
---$ export LC_ALL=ru_RU.UTF-8;
$ echo ФВЫАФЫВАРОППРТШЬШКЦЙЦВЦ | sed "y/АБВГҐДЕЁЖЗИЫІЙКЛМНОПРСТУФЦ/ABVHGDEEGZYYIJKLMNOPRSTUFC/"
FVYAFYVAROPPRTШЬШKCJCVC$ export LC_ALL=C
$ echo ФВЫАФЫВАРОППРТШЬШКЦЙЦВЦ | sed "y/АБВГҐДЕЁЖЗИЫІЙКЛМНОПРСТУФЦ/ABVHGDEEGZYY
sed: -e expression #1, char 82: strings for `y' command are different lengths
> в одной 4-байтные символы, в другой обычный ASCIIЭто верно, но ваша демонстрация:
> $ export LC_ALL=ru_RU.UTF-8;
> $ echo ФВЫАФЫВАРОППРТШЬШКЦЙЦВЦ | sed "y/АБВГҐДЕЁЖЗИЫІЙКЛМНОПРСТУФЦ/ABVHGDEEGZYYIJKLMNOPRSTUFC/"
> FVYAFYVAROPPRTШЬШKCJCVC
> $ export LC_ALL=C
> $ echo ФВЫАФЫВАРОППРТШЬШКЦЙЦВЦ | sed "y/АБВГҐДЕЁЖЗИЫІЙКЛМНОПРСТУФЦ/ABVHGDEEGZYY
> sed: -e expression #1, char 82: strings for `y' command are different
> lengthsВы сами намеренно обрезали количество входных символов замены для того, что бы якобы продемонстрировать проблему кодировки локали. Естественно, что оно даже без крона выдаст ошибку. И LC_ALL в данном конкретном случае здесь ни при чем.
АБВГ надо сравнивать с ABVH, а не с AB (!)
>[оверквотинг удален]
>> FVYAFYVAROPPRTШЬШKCJCVC
>> $ export LC_ALL=C
>> $ echo ФВЫАФЫВАРОППРТШЬШКЦЙЦВЦ | sed "y/АБВГҐДЕЁЖЗИЫІЙКЛМНОПРСТУФЦ/ABVHGDEEGZYY
>> sed: -e expression #1, char 82: strings for `y' command are different
>> lengths
> Вы сами намеренно обрезали количество входных символов замены для того, что бы
> якобы продемонстрировать проблему кодировки локали. Естественно, что оно даже без крона
> выдаст ошибку. И LC_ALL в данном конкретном случае здесь ни при
> чем.
> АБВГ надо сравнивать с ABVH, а не с AB (!)Странные вы, вопрошающие, мало того что сами найти ошибку не в состоянии, так ещё завидное упорство проявляете в своих заблуждениях.
Свободен.следующий.
> сами найти ошибку не в состоянии
Если задать вопрос на американском форуме, вам ответят. Если задать вопрос на израильском форуме, вам зададут встречный вопрос. Если задать вопрос на русском форуме, вам будут долго объяснять, какой вы мудак.
Этот топик – отличная иллюстрация выше изложенного, а вы – типичный троль, который ничего дельного кроме засорения не написал.
Надо было сразу спросить на stackoverflow. За 1-2 поста был бы ответ, а не как здесь - натролили много букафф бес толку.
Со времени топикстарта перевел последних 2 старых сервера на wheezy и мой первоначальный вариант скрипта отлично работает теперь на всех серверах (без какой либо дополнительной настройки локалей или самбы как неумолимо глупо здесь писал один сказочный персонаж). Только время здесь убил на подкармливание троллей вроде вас, которые сравнивают
АБВГҐДЕЁЖЗИЫІЙКЛМНОПРСТУФЦ/ABVHGDEEGZYY
вместо
АБВГҐДЕЁЖЗИЫІЙКЛМНОПРСТУФЦ/ABVHGDEEGZYYIJKLMNOPRSTUFC
А потом что-то лепят о:
command are different lengths
Ведь понятно даже с количества символов, что будет ошибка.
Впрочем, неважно уже. Как вы писали:> Свободен.следующий.
Ухожу с радостью, что больше здесь мне вас, троллей, кормить не придется. Извините, но далее без меня, зовите следующего!
>> сами найти ошибку не в состоянии
>Если задать вопрос на американском форуме, вам ответят. Если задать вопрос на
> израильском форуме, вам зададут встречный вопрос. Если задать вопрос на русском
> форуме, вам будут долго объяснять, какой вы мудак.Потому что ты - мудак, тебе даже sed об этом написал:
sed: -e expression #1, char 82: strings for `y' command are different lengths
sed: -e expression #1, char 82: strings for `y' command are different lengthssed тоже аццкий тролль? идевается над тобой гад.
> Вы сами намеренно обрезали количество входных символов замены для того,
> что бы якобы продемонстрировать проблему кодировки локали.Да, делать мне больше нех...я, - детешек унижать. С первого сообщения видно что ты лошарик.
Тебя мордой ткули, что ты UTF8 пытаешься в ASCII конвертнуть, потому что локаль кревая.
Нет пля, сопли пузырями, понты качает.
Correct answer: use English, Luke! :)