Друзьям скриптоводам

BuG2BuG

Демон FreeBSD
Хочу устроить массовое переименование файлов одной директории. Файлы пишутся через пробел. В этом вся проблема. От них [пробелов] надо избавиться. То есть:

Код:
#!/bin/sh

for i in $( find ./ -name "*.mp3" | sed "s/ /\\\\ /g" ); 
do
export ii=`echo $i | sed "s/\\\\ //g"`
mv $i $ii
done

не работает, хотя я и заменяю все ' ' на '\ ', он их видимо сливает в одну строку и просто не находит файлов в директории:

Код:
bug2bug% ls -la
total 8
drwxr-xr-x   2 user  wheel   512 Mar 11 11:33 .
drwxr-xr-x  49 user  wheel  3584 Mar 11 11:32 ..
-rw-r--r--   1 user  wheel	 0 Mar 11 11:33 hello world.mp3
-rwxr-xr-x   1 user  wheel   127 Mar 11 11:33 rename.sh
-rw-r--r--   1 user  wheel	 0 Mar 11 11:33 this is a test.mp3
bug2bug% ./rename.sh 
mv: rename ./hello\ to ./hello\: No such file or directory
mv: rename world.mp3 to world.mp3: No such file or directory
mv: rename ./this\ to ./this\: No such file or directory
mv: rename is to is: No such file or directory
mv: rename a to a: No such file or directory
mv: rename test.mp3 to test.mp3: No such file or directory
bug2bug%

Что можно с этим сделать?

С Уважением,
 

vav

Moderator
for тут неприменим, потому что для него знак пробела -- это тоже разделитель, а заескейпить его нельзя. Надо делать так:
Код:
find /dir -name '*.mp3' | while read i; do
тело цикла
done
 

Mike22

Местный
А можно и без find обойтись :)
Код:
ls *" "*.mp3 | while read file; do mv "$file" "$(echo "$file" | sed -e "s/ /_/")"; done;
Но ещё помнить нужно, что пробелов может быть несколько в имени файла причём подряд и/или нет.
С регэкспами можно поиграть и все варианты за один проход обработать.
 

BuG2BuG

Демон FreeBSD
Глобальная должна работать:

Код:
sed -e "s/ /_/g"

С Уважением,
 

BuG2BuG

Демон FreeBSD
Обожаю юникс. Обожаю язык sh. Только что извращался с определением занимаемого на диске места директорией. Вот что получилось:

Способ №1:
Код:
du -h | tail -n 1 | awk '{print substr($1, 1, length($1) - 1);}'

Способ №2 [занимательный ^_^]:
Код:
export x=`export a=0; du | awk '{print $1;}' | while read i; do; export a=$(expr $a + $i); done; echo $a`; echo $(expr $x / 1024 / 2)

С Уважением,
 

Mike22

Местный
Обожаю юникс. Обожаю язык sh. Только что извращался с определением занимаемого на диске места директорией. Вот что получилось:
Можно проще ^_^

Способ №1:
Код:
du -s -B 1048576 . | awk '{print $1}'
Способ №2:
Код:
export x=`du -s -B 1048576 . | awk '{print $1}' `

Но так наверное не интересно :) :)
 

BuG2BuG

Демон FreeBSD
Недавно я говорил, что есть такая штука - Music Player Daemon. Её преимущество ещё и в том, что есть к ней скриптовый клиент - mpc. То есть с его помщью можно делать всякие забавные вещи. Например, вместо того, чтобы писать плагин для XChat'а [IRC], сообщающий "Now Playing...", прописал алиас на /mpcnow:

Код:
/exec -o /bin/sh -c 'export MPD_HOST=192.168.0.1;mpc --format "Я слушаю %artist% <%album%> - %title% #[%time%#] ==> %file% #[Аутпут из MPC #[`uname -srp` -- `date`#]#]"|head -n1'

И ещё пару алиасов для управления музыкой [/mpcnext, /mpcstop и т.д.] прямо из XChat!

Самое интересное заключается в следующем: можно с помощью стандартного супердемона inetd, mpc и самописного sh-скрипта построить сервер управления музыкой.

За это я люблю *nix.

С Уважением,
 

BuG2BuG

Демон FreeBSD
Помогите, друзья скриптоводы!
Что делать, если я хочу получить значение арифметического выражения. expr не подходит по определению, ибо не считает степени.
Конкретный пример: нужно посчитать 3 в 5 степени.
Поступаю вот так, но не думаю, что это самое рациональное решение:

Код:
echo | awk '{print 3 ^ 5}'

Что можете порекомендовать?

С Уважением,
 

BuG2BuG

Демон FreeBSD
Спасибо большое, помогло, хорошая штука, только вот считает в обратной польской нотации, чуток непривычно. :(
Ещё один вопрос. А скажем синусы, косинусы и логарифмы без привлечение питона, перла и пхп посчитать можно?

С Уважением,
 

Mike22

Местный
А скажем синусы, косинусы и логарифмы без привлечение питона, перла и пхп посчитать можно?
Забыл Руби упомянуть :(
Тебе проще написать самому утилитку на С для вычисления нужных функций. (два десятка строк займёт)
Получится лёгкое и простое решение.
 

BuG2BuG

Демон FreeBSD
А если нужны составные функции писать разбор выражений? Нет уж, увольте. :(
Лучше наверное тогда так:

Код:
python -c 'import math; print math.sin(math.pi) + 26 * math.exp(3) / math.pow(3, 5) + math.log(100) / math.log(10)'

С Уважением,
 

Mike22

Местный
А если нужны составные функции писать разбор выражений? Нет уж, увольте. :(
Гм
Что-то не пойму я.
Переменные отменили что-ли? Вложенные выражения? Передачу параметров?
Если нужно "лёгкое" решение, то написание своей утилитки для расчёта нескольких необходимых функций - лучший вариант.
Но если устраивает загрузка в память полноценного интерпретатора, да ещё и с дополнительными библиотеками,
то тогда действительно смысла возиться нет.

Кстати, ещё обрати внимание на ключ -l у калькулятора bc.
 

BuG2BuG

Демон FreeBSD
Гм
Что-то не пойму я.
Переменные отменили что-ли? Вложенные выражения? Передачу параметров?

Имелось в виду приложение, которое в виде массива чаров получает сложное выражение и выдаёт конечный результат, например:

Код:
./myprog sin(cos(exp(2)))

Или

Код:
./myprog sqrt(2^13)*123+3/4.

Для написания такого приложения без алгоритмов парсинга Рутисхаузера, Бауэра и Замельзона не обойтись. Я ещё пока не готов писать такие приложения. Чисто морально.

Зачем мне нужна программа / скрипт, исчисляющий выражения? Например для создания cgi-скрипта, с веб-страницы выдающего результат обработки сложного математического выражения. Вот зачем оно надо.

P.S.: Вот оно, то что я искал. bc вместо dc! Отлично, спасибо, о Mike22.

С Уважением,
 

mi5hka

Пользователь
Может надо было создать новую тему, потому что это не sh. Но вот что у меня получилось, из попытки написать скрипт для проверки баланса:
Код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from urllib import urlopen
from re import findall
f = urlopen( 'http://www.vega-int.ru/cgi-bin/stats/main' )
for line in f.readlines():
if line[4:16] == 'Баланс': 
print line[4:80] + findall(r"[0-9]+\.[0-9][0-9]", line)[0]


f.close()
 

BuG2BuG

Демон FreeBSD
Давайте оставим всё здесь и будем постить сюда. Всё-таки скрипты.
А Ваш скрипт для проверки баланса хорош. Осталось только загнать его в крон с выводом на нулевую консоль. B)

С Уважением,
 

BuG2BuG

Демон FreeBSD
Как лучше проверить из скрипта, смонтировано ли устройство?
Делаю вот так:

Код:
df | grep sd0a | wc | awk '{print $1;}'

Возвращает 1 - если смонтировано, 0 в противном случае. Не думаю, что это самое рациональное решение. Может это можно реализовать как-то проще?

С Уважением,
 

mi5hka

Пользователь
Информер погоды в консоли, жаль что идея не моя.
Полезные советы по линукс

Екатеринбург:
Код:
curl -s  http://informer.gismeteo.ru/text/28440-1.JS|sed -e 's/^.*write("//g;s/\(<[^>]*>\)\+/\n/g;s/");//g'|iconv -f cp1251 -t UTF-8

Челябинск:
Код:
curl -s  http://informer.gismeteo.ru/text/28642-1.JS|sed -e 's/^.*write("//g;s/\(<[^>]*>\)\+/\n/g;s/");//g'|iconv -f cp1251 -t UTF-8
 

Mike22

Местный
Как быстро сгенерировать пароль без специальных программ?
Вот три варианта -
Код:
dd if=/dev/random bs=6 count=1 2> /dev/null | uuencode -m - | head -2 | tail -1
Код:
echo "(секретная фраза <-- вставьте свою) websiteX.com" | md5sum | cut -c1-8
Код:
dd if=/dev/random bs=100 count=1 | tr -cd 'A-Za-z1-9!@#%^&' | head -c 8
Придумал не я
 
Сверху