Автор Тема: shell script  (Прочетена 10261 пъти)

villimon

  • Напреднали
  • *****
  • Публикации: 65
    • Профил
shell script
« -: Oct 18, 2013, 19:44 »
Здравейте,
не от дълго се занимавам с програмиране и ми казаха да се запозная с Linux не съм много на вътре в нещата и ми трябва малко помощ ако може някои да ми обясни малко.
Въпроса ми е следния мога ли да напиша скрипт на които да му подам име на директория и той да ми изведе всички изпълними файлове в дървото започващо от зададената директория, като дърво с отместване което да отразява нивото на вложеност.
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: shell script
« Отговор #1 -: Oct 18, 2013, 20:45 »
Код:
#vim test.sh

Код
GeSHi (Bash):
  1. #!/bin/bash
  2. ls -lRa $1

Код:
#chmod +x test.sh
#./test.sh /home

http://tldp.org/LDP/abs/html/localvar.html
« Последна редакция: Oct 18, 2013, 20:50 от b2l »
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

dexxa

  • Напреднали
  • *****
  • Публикации: 26
    • Профил
Re: shell script
« Отговор #2 -: Oct 18, 2013, 21:02 »
b2l - това ще листне всичкио
villimon - пробвай на ред 2. от скрипта предложен от b2l да сложиш това:
find $1 -executable -type f

Поздрави
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: shell script
« Отговор #3 -: Oct 18, 2013, 21:20 »
Опа, не съм допрочел, че търсим изпълними файлове.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: shell script
« Отговор #4 -: Oct 18, 2013, 22:59 »
Ако държим да е с ls, може например така
Цитат
ls -FRla | grep \*$
или така
Цитат
ls -FRla | grep '*'
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

villimon

  • Напреднали
  • *****
  • Публикации: 65
    • Профил
Re: shell script
« Отговор #5 -: Oct 19, 2013, 09:04 »
Първо разбирам че съм объркал мястото на темата за което приемете моите извинения.

Благодаря за отговорите,
Ще може ли и няколко разяснения
ls -FRla - тази част от командата разбирам какво прави
но не знам grep '*' - можете ли да ме насочите къде да го прочета или да ми обясните.

командите find $1 -executable -type f извеждат пълния път до файловете има ли начин да се форматира изхода

Примерно имам дървото:

dirHome
    dir1
         dir1_1
         dir1_2
    dir2

и да визуализирам изпълнимите файлове от това дърво с отместване отговарящо на нивото на влюбеност.
Активен

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: shell script
« Отговор #6 -: Oct 19, 2013, 13:13 »
А, то трябвало да е в дървовидна структура. Тогава ти е нужен инструментът tree. Инсталирай го, ако нямаш такава команда. Зачети се в изхода от командите 'tree --help' и 'man tree', за да разбереш повече за опциите, които поддържа. За твоите нужди командата може да бъде например така
Цитат
tree -F | grep '[*|/]'

Целта на флага -F както в tree, така и в ls, е да добави знаци за типовете на файловете. На изпълнимите файлове се добавя звездичка (*) и това е причината с grep да указваме да се прихванат редовете, съдържащи звездичка. Понеже искаш да извеждаш и директориите, а директориите съдържат наклонена черта в името си в изходите от ls и tree, затова към grep сега добавих и прихващане на редове, съдържащи наклонена черта. Целта на grep е да отсее ненужните редове и да покаже само търсените, а това, което се подава на grep е прост регулярен израз (regex), указващ съвпадение, ако се съдържа звездичка или (правата черта значи "или") наклонена черта.

П.П.: Може би има нужда да се спомене, че флагът -F добавя звездичка на всички файлове, съдържащи бит за изпълнение, независимо дали този бит е зададен и на трите групи права (потребител-собственик, група-собственик и други) или само на някоя от тях, така че tree и ls ще покажат всички файлове, съдържащи бит за изпълнение, в изхода, независимо дали потребителят, изпълняващ tree и ls, има право да изпълни файла или не.
« Последна редакция: Oct 19, 2013, 14:19 от neter »
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

villimon

  • Напреднали
  • *****
  • Публикации: 65
    • Профил
Re: shell script
« Отговор #7 -: Oct 19, 2013, 19:49 »
Aко tree не е инсталирано на дистрибуцията където стартирам скрипта ще работи ли ?
Aз мисля че може да сложа командата за инсталиране в скрипта, но така ще се инсталира при всяко стартиране
имате ли по добро решение
« Последна редакция: Oct 20, 2013, 06:41 от villimon »
Активен

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: shell script
« Отговор #8 -: Oct 19, 2013, 20:17 »
Не е "free" (като свободен), а "tree" (като дърво) :)

Няма да работи, ако не е инсталирано. Е, би могъл да се направи portable пакет на tree, който да си влачиш в архива, заедно със скрипта и да го викаш с пълен път до мястото, където си го разархивирал, но е излишна, а може да се окаже и относителна, занимавка. Може да добавиш към скрипта проверка дали tree е инсталиран (проверка дали командата я има или дали я има в списъка с инсталирани пакети в системата, или някаква друга проверка или комбинация от проверки за наличност), и ако не е инсталиран, скриптът да го инсталира, след което да се стига до изпълнението на командата с tree. Инсталирането би било най-добре да се прави от хранилищата с пакетния мениджър на системата. Зависи обаче за каква дистрибуция (или дистрибуции) става дума. Debian базираните използват apt, Red Hat базираните използва yum, има и други пакетни мениджъри в други дистрибуции, а има и такива дистрибуции, които нямат пакетни мениджъри. Ако ще се ползват само дистрибуции, ползващи един и същ пакетен мениджър, забиваш в скрипта командата за инсталиране със съответния мениджър в случай, че tree липса, и си готов. Ако ще се ползват дистрибуции с различни пакетни мениджъри, ще трябва да добавиш проверки за вида на пакетния мениджър в текущата система и команди за всеки от необходимите пакетни мениджъри. Ако ще се ползват и дистрибуции без пакетни мениджъри, ще се наложи в скрипта да намесиш и компилиране на tree от изходен код.
И все пак си мисля, че е по-добре да оставиш инсталирането на tree да се случва извън скрипта, като може най-много да сложиш една проверка има ли я командата tree, и ако я няма, да пише, че трябва да се инсталира преди това. Например
Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. RESULT=$(tree -F 2>/dev/null | grep '[*|/]')
  4.  
  5. test $? = 0 && echo "$RESULT" || echo 'Резултатът от търсенето е празен или пакетът tree не е инсталиран'
Пълним изхода от tree командата в променливата $RESULT, като насочваме stderr (грешките) към небитието (/dev/null), за да не ни се бъркат в съобщенията. Отдолу командата test проверява дали статусът от изпълнението на предната команда ($?) е равен на нула (което значи, че няма грешки, т.е., командата е налична), и ако е равен на нула, принтира съдържанието на променливата $RESULT, а ако не е равен на нула - принтира съобщението за нуждата от инсталиране. При извеждане на съдържанието на $RESULT може да ползваш и printf, вместо echo, ако изпитваш проблеми със сливане на редовете от изхода в един общ ред от echo.
« Последна редакция: Oct 19, 2013, 20:41 от neter »
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

villimon

  • Напреднали
  • *****
  • Публикации: 65
    • Профил
Re: shell script
« Отговор #9 -: Oct 20, 2013, 10:44 »
Стигнах до тук
Код
GeSHi (Bash):
  1. #! /bin/bash
  2.  
  3. cd .$1
  4.  
  5. dpkg -s tree>&/dev/null
  6.  
  7. if test $? != 0
  8. then echo "Пакетът tree не е инсталиран"
  9.  
  10. else RESULT=$(tree -F 2>/dev/null | grep '[*]')
  11.    if test $? = 0
  12.    then echo "$RESULT"
  13.    else echo 'Резултатът от търсенето е празен'
  14.    fi
  15. fi

имате ли някакви препоръки.
Активен

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Re: shell script
« Отговор #10 -: Oct 20, 2013, 20:44 »
Има и по-елегантен начин със използването на find:
find . -perm "+1" -type f
Активен

mobilio - професионални мобилни приложения

villimon

  • Напреднали
  • *****
  • Публикации: 65
    • Профил
Re: shell script
« Отговор #11 -: Oct 21, 2013, 07:26 »
Прав сте изглежда по изящно но идеята ми е да ми изведе само изпълнимите файлове с изместване съответстващо на влюбеността им в дървото.

find ми извежда целия път не съм много добре запознат и съм отворен към всякакви предложения.
Активен

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Re: shell script
« Отговор #12 -: Oct 21, 2013, 13:32 »
find има още една полза... може да стартира приложение за всеки обект който намери (директория, файл, линк и т.н.).

Така като стартира приложението то ще свърши мръсната работа. Може да използваш awk и да броиш / като ги заместваш със табове и да се получи желания резултат.

Всъщност find е невероятно мощен инструмент за който не подозирах до преди няколко години.
Активен

mobilio - професионални мобилни приложения

villimon

  • Напреднали
  • *****
  • Публикации: 65
    • Профил
Re: shell script
« Отговор #13 -: Oct 21, 2013, 16:34 »
С awk как може да се преброят директориите до файла
« Последна редакция: Oct 21, 2013, 16:53 от villimon »
Активен

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: shell script
« Отговор #14 -: Oct 21, 2013, 22:23 »
Стигнах до тук
Код
GeSHi (Bash):
  1. ...
  2. dpkg -s tree>&/dev/null
  3. ...
  4. else RESULT=$(tree -F 2>/dev/null | grep '[*]')
  5. ...
имате ли някакви препоръки.
Защо си оставил само звездичката в квадратните скоби? Така ще се покажат само имената на изпълнимите файлове. Нали искаше да се показват и директориите? Демек, вторият цитиран ред от скрипта трябва да е така
Код
GeSHi (Bash):
  1. else RESULT=$(tree -F 2>/dev/null | grep '[*|/]')
А в първия цитиран ред дали не си разменил местата на > и & :)

С други инструменти ще си е играчка да се докара такъв дървовиден вид. Но може да си поиграя, ако ми остане време. Точно това, което изкарва tree ли трябва да се получи или имаш някакви разлики или по-добри идеи в нужния за теб изглед? И какво точно имаш предвид под преброяване на директории?
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
rc.d shell script
Настройка на програми
VlasA 3 2635 Последна публикация Aug 29, 2004, 12:05
от VlasA
Shell-script- за минаване от един юзър в друг
Настройка на програми
Nik123 5 3343 Последна публикация Jul 03, 2006, 20:22
от Nik123
shell script с параметри
Общ форум
k0tka 1 2649 Последна публикация May 25, 2012, 20:23
от k0tka
ПРЕМЕСТЕНО: shell script
Общ форум
neter 0 1875 Последна публикация Oct 18, 2013, 22:59
от neter
shell script за newuser
Общ форум
theshit 6 2517 Последна публикация May 11, 2014, 22:02
от go_fire