помогите написать скриптик на bash

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
sedition
Сообщения: 556
ОС: Gentoo/MacOSX/Windows Vista

помогите написать скриптик на bash

Сообщение sedition »

есть 100 файлов с расшерением .flv.mpg , нужно переименовать в .mpg, уже 2-й день пытаюсь написать скрипт, который бы сделал это =)
собственно проблема в том, чтобы отрезать расширение .flv.mpg

я думал сделать так:
for i in `ls`
do
тут должна быть строчка обрезающая имена
mv $i $j.mpg
done

пробовал отрезать sed'om - получилось отрезать только первые буквы(имя)
Спасибо!
Спасибо сказали:
Аватара пользователя
Сфинкс
Сообщения: 7
ОС: Gentoo Linux

Re: помогите написать скриптик на bash

Сообщение Сфинкс »

Код: Выделить всё

for f in *.flv.mpg
do
    mv $f ${f%'.flv.mpg'}'.mpg'
done
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: помогите написать скриптик на bash

Сообщение elide »

Код: Выделить всё

rename '.flv.' '.' *


или, если уж хотите изврата, то можно проще сделать

Код: Выделить всё

for f in *.flv.mpg
do
    mv $f ${f/.flv/}
done
слава роботам!
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: помогите написать скриптик на bash

Сообщение Voice »

А може тогда и мне поможете ;)

Нужен скрипт, который просто скопирует каталог со всеми подкаталогами, но без файлов. То есть, в результате должно получится дерево пустых каталогов.
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
broom
Бывший модератор
Сообщения: 1629
Статус: мизантроп.ка
ОС: Gentoo

Re: помогите написать скриптик на bash

Сообщение broom »

Voice
можно find'ом найти все директории (find -type d), а потом уже их скопировать.
but in the darkness, behind your smile, you scream... © Dio
Спасибо сказали:
Аватара пользователя
sedition
Сообщения: 556
ОС: Gentoo/MacOSX/Windows Vista

Re: помогите написать скриптик на bash

Сообщение sedition »

Прокоментируйте пожалуйста, не очень понятна строчка: mv $f ${f%'.flv.mpg'}'.mpg'

а так - ОГРОМНОЕ СПАСИБО, все работает
Спасибо!
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: помогите написать скриптик на bash

Сообщение Uncle_Theodore »

sedition писал(а):
08.03.2007 14:55
Прокоментируйте пожалуйста, не очень понятна строчка: mv $f ${f%'.flv.mpg'}'.mpg'

а так - ОГРОМНОЕ СПАСИБО, все работает

man bash

Код: Выделить всё

 ${parameter%word}
 ${parameter%%word}
              The  word  is  expanded to produce a pattern just as in pathname
              expansion.  If the pattern matches a  trailing  portion  of  the
              expanded value of parameter, then the result of the expansion is
              the expanded value of parameter with the shortest matching  pat-
              tern  (the  ``%''  case)  or  the  longest matching pattern (the
              ``%%'' case) deleted.  If parameter  is  @  or  *,  the  pattern
              removal  operation  is  applied  to each positional parameter in
              turn, and the expansion is the resultant list.  If parameter  is
              an  array  variable subscripted with @ or *, the pattern removal
              operation is applied to each member of the array  in  turn,  and
              the expansion is the resultant list.


$ f=abracadabra.bums
$ echo ${f%'cadabra.bums'}
abra
Спасибо сказали:
Аватара пользователя
sedition
Сообщения: 556
ОС: Gentoo/MacOSX/Windows Vista

Re: помогите написать скриптик на bash

Сообщение sedition »

все понял, всем спасибо. я 2 дня колупался и шел не в том направлении
Спасибо!
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: помогите написать скриптик на bash

Сообщение Voice »

broom писал(а):
08.03.2007 11:17
Voice
можно find'ом найти все директории (find -type d), а потом уже их скопировать.


Придумал вот так:

Код: Выделить всё

#!/bin/bash

mkdir "wp_music"

for f in `find /music/ -type d`
do
    mkdir "./wp_music/$f"
    #echo "$2$f"
done


Но тут приколы получаются с каталогами имена которых содержат пробелы. Я же в кавычки взял, как это преодолеть?
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
broom
Бывший модератор
Сообщения: 1629
Статус: мизантроп.ка
ОС: Gentoo

Re: помогите написать скриптик на bash

Сообщение broom »

but in the darkness, behind your smile, you scream... © Dio
Спасибо сказали:
Аватара пользователя
sedition
Сообщения: 556
ОС: Gentoo/MacOSX/Windows Vista

Re: помогите написать скриптик на bash

Сообщение sedition »

вечером еще поразбирался с sed'om и наваял скриптик, переименовывающий файлы *.flv.mpg to *.mpg

#!/bin/bash
for a in `ls`
do
b=`echo $a | sed 's/flv.mpg/mpg/'`;
mv $a $b
done
Спасибо!
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: помогите написать скриптик на bash

Сообщение Voice »


Ну, делаю так же, а оно не работает. :( В кавычки же нужно заключить переменную?

Код: Выделить всё

#!/bin/bash

for f in `find ./downloads/ -type d`
do
    echo "$f"
done


Выводит:
.

Код: Выделить всё

/downloads/pictures
./downloads/sources
./downloads/name
with
space
./downloads/name
with
space/NS
./downloads/name
with
space/computers


Но если в консоли написать, то работает:

Код: Выделить всё

[viacheslav@localhost test] $ echo "a s f            kjkkklkl"
a s f            kjkkklkl
[viacheslav@localhost test] $

Что-то них я не понимаю...
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
BaBL
Сообщения: 767
ОС: Debian GNU/Linux SID

Re: помогите написать скриптик на bash

Сообщение BaBL »

глянь в разделе программирования APE2FLAC
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: помогите написать скриптик на bash

Сообщение diesel »

for f in "`find ./downloads/ -type d`"
мне больше понравился вариант который тут когда-то показали:

find ./downloads/ -type d|while read i; do echo $i; done
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: помогите написать скриптик на bash

Сообщение Uncle_Theodore »

Может тебе "find..." в кавычки взять?
Вот смотри.

Директория work содержит директорию с именем "youly paly"

~$ for f in `find work/ -type d`; do echo "$f"; done
work/
work/2006
work/youly
paly

~$ for f in "`find work/ -type d`"; do echo "$f"; done
work/
work/2006
work/youly paly
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: помогите написать скриптик на bash

Сообщение Voice »

Uncle_Theodore писал(а):
08.03.2007 19:56
Может тебе "find..." в кавычки взять?
Вот смотри.
....

О! Это помогло. Теперь новый прикол.

Код: Выделить всё

#mkdir "out"

for f in "`find ./downloads/ -type d`"
do
    echo "./out/$f"
done


Код: Выделить всё

[viacheslav@localhost test] $ ./cpdirs
./out/./downloads/
./downloads/html
./downloads/html/Программирование сокетов в Linux_files
./downloads/html/Программирование сокетов в Linux_files/orphus_data
./downloads/html/RFC 913 (SFTP)_files
./downloads/html/docs.kde.org

Почему первая строка получилась нормальной, а остальные нет??? :wacko:
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: помогите написать скриптик на bash

Сообщение v04bvs »

diesel писал(а):
08.03.2007 19:54
for f in "`find ./downloads/ -type d`"
мне больше понравился вариант который тут когда-то показали:

find ./downloads/ -type d|while read i; do echo $i; done

Этот вариант не работает в случае, если имена содержат символ \n
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: помогите написать скриптик на bash

Сообщение diesel »

v04bvs писал(а):
08.03.2007 20:29
diesel писал(а):
08.03.2007 19:54

for f in "`find ./downloads/ -type d`"
мне больше понравился вариант который тут когда-то показали:

find ./downloads/ -type d|while read i; do echo $i; done

Этот вариант не работает в случае, если имена содержат символ \n

вобщем-то да :-) я пока правда у себя ни одного такого не встречал, а такие файлы вообще можно сделать? :-)
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: помогите написать скриптик на bash

Сообщение KiWi »

diesel писал(а):
08.03.2007 21:04
вобщем-то да :-) я пока правда у себя ни одного такого не встречал, а такие файлы вообще можно сделать? :-)

Если очень захотеть, то можно:

Код: Выделить всё

$ touch "aaa
bbb"
Спасибо сказали:
fornike
Сообщения: 246

Re: помогите написать скриптик на bash

Сообщение fornike »

Чтоб не создавать тему решил здесь спросить:

Код: Выделить всё

#/bin/bash
ST1=`ps aux|grep -c xskynet`
ST2='2'
if [ -z "$ST1"="$ST2"  ]
then /windows/D/openskynet-091/xskynet
else echo $ST1
fi


Так вот: постоянно срабатывает второе условие. Есть ли скайнет в процессах, нету ли: всё равно всегда срабатывает echo $ST1. Права на запуск есть. Что неправильно то?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: помогите написать скриптик на bash

Сообщение Uncle_Theodore »

man bash

Код: Выделить всё

  -z string
              True if the length of string is zero.


Собственно, выполнение какого условия проверяется этим if'ом?
Спасибо сказали:
fornike
Сообщения: 246

Re: помогите написать скриптик на bash

Сообщение fornike »

(Uncle_Theodore @ Mar 26 2007, в 23:10) писал(а):Собственно, выполнение какого условия проверяется этим if'ом?

Понял.. -z знач тут нефтему. Вобщем смысл скрипта - проверять висит ли в процессах xskynet, если не висит - запускать. А условие тут: проверять равны ли строки ST1,ST2 и соответственно если неравны, то запускать xskynet.
Может я как то через нето место это пытаюсь сделать, но просто не придумал как ещё. Вобщем как сделать красивее?
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: помогите написать скриптик на bash

Сообщение elide »

просто запускай его как

Код: Выделить всё

while :; do /windows/D/openskynet-091/xskynet; done
и не надо никаких скриптов...
слава роботам!
Спасибо сказали:
Slava85
Сообщения: 28
ОС: fedora core 6

Re: помогите написать скриптик на bash

Сообщение Slava85 »

pgrep xskynet - самое простое))
home: labtop asus z99h & desktop - fedora core 6
work: fedora core 6
Спасибо сказали:
Аватара пользователя
SANTA
Сообщения: 181
ОС: GNU/Linux

Re: помогите написать скриптик на bash

Сообщение SANTA »

Я тоже с просьбой.
Вообщем нужно сваять скрипт который будет делать след.:
Дано - корневая директория (допустим) /tmp/share (права 770, владелец-admin, группа-users). В этой директории есть другие директории, в которых права такие-же как и на share, владелец тоже admin, но группы уже во всех отличаются. Вообщем нужно написать скрипт, который бы в каждом каталоге менял права файлам и поддиректориям на родительские.
Например:
/tmp/share - drwxrwx--- admin users
|
--dir1 - drwxrwx--- admin group1
|
--dira - drwxrwx--- admin users
|
---dir2 - drwxrwx--- admin group2
Нужно директори dira находящейся в dir1 поменть группу как у dir1.
Вообщем пробовал так

Код: Выделить всё

find /tmp/share -type d -exec chown -R admin:`ls -al  |sed 1d |sed 2,\$d | awk '{print $4}'` {} \;

Который делает все директории admin:users.
Спасибо сказали:
Аватара пользователя
SANTA
Сообщения: 181
ОС: GNU/Linux

Re: помогите написать скриптик на bash

Сообщение SANTA »

Проблему решил

Код: Выделить всё

#!/bin/sh
for i in `find /tmp/share/* -type d`
do
/bin/chown -R admin:`ls -al $i | sed -n 2p | awk '{print $4}' ` $i
done
Спасибо сказали:
Аватара пользователя
Хрюндель
Сообщения: 304
ОС: Сам не знаю

Re: помогите написать скриптик на bash

Сообщение Хрюндель »

Написал тут запоминатель паролей, вот думаю как бы шифровать пароли в нём, а назад возвращать в нормальном виде если ввести главный пароль.

Сам скриптик залил сюда http://muzx.net/zpass.tar

Вообще в теории хотя бы как это сделать?
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: помогите написать скриптик на bash

Сообщение v04bvs »

Хрюндель писал(а):
04.04.2007 20:51
Написал тут запоминатель паролей, вот думаю как бы шифровать пароли в нём, а назад возвращать в нормальном виде если ввести главный пароль.

Сам скриптик залил сюда http://muzx.net/zpass.tar

Вообще в теории хотя бы как это сделать?

man openssl
Спасибо сказали:
Аватара пользователя
Хрюндель
Сообщения: 304
ОС: Сам не знаю

Re: помогите написать скриптик на bash

Сообщение Хрюндель »

man openssl


Угу, немного разобрался. Щас вот думаю над теорией, как правильно сделать.

1. Складывать пароли в открытом виде в файл и шифровать этот файл симетричным методом.
2. Складывать шифрованые симетричным методом пароли в обычный файл.

Какой метод правильние?

(напомню что в итоге нужно по определённому passpharse получить в ответ пароли от записей в открытом виде)
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: помогите написать скриптик на bash

Сообщение v04bvs »

Хрюндель писал(а):
05.04.2007 17:52

man openssl


Угу, немного разобрался. Щас вот думаю над теорией, как правильно сделать.

1. Складывать пароли в открытом виде в файл и шифровать этот файл симетричным методом.
2. Складывать шифрованые симетричным методом пароли в обычный файл.

Какой метод правильние?

(напомню что в итоге нужно по определённому passpharse получить в ответ пароли от записей в открытом виде)

я бы делал 1-м способом.
Только учитывай, что содержимое удалённого файла на диске остаётся, т.е. для удаления временных файлов надо использовать что то вроде shred.
Ну и можно много других параноидальных штук придумать, в общем если для себя делаешь, то нормально будет.
Спасибо сказали: