Лабораторная по Линуксу, по-быстрому :)

Discussion in 'Болталка' started by xGOR, 9 May 2010.

  1. xGOR

    xGOR Elder - Старейшина

    Joined:
    25 Nov 2007
    Messages:
    83
    Likes Received:
    38
    Reputations:
    -5
    Кароче, тема такая. Тут из лабораторных по линуксу попалась одна по программированию под shell. Читать и перечитывать книги неохота. А одну программку маленькую написать все таки надо :) Естественно она у меня не получается.
    Задача следующая:
    Есть программа, передаем в неё два параметра: первый - каталог, второй - "ключ". Программа должна вывести на экран все файлы/каталоги которые соотвествуют даному ключу. В лабораторной пишут, что имеются следующие ключи:
    r - файл существует и разрешён для чтения;
    ....
    f - "простой" файл;
    d- каталог.

    Вот что у меня получилось:
    Code:
    $k=0
    for loop in `ls $1`
    do
         if [ test -$2 $loop ] then $k=$k+1
    done
    echo $k
    
    Просьба исправить программу так, чтобы правильно работала. Буду благодарен.
     
  2. COMEJIbE

    COMEJIbE New Member

    Joined:
    6 Apr 2010
    Messages:
    18
    Likes Received:
    3
    Reputations:
    0
    если "ключ" совпадает с ключем команды test - то я бы сделал так:

    Code:
    for file in "$1"/*
    do
         test -$2 "$file" && echo `basename "$file"`
    done
    никаких `ls ...`, for разворачивает звездочку в список файлов. из минусов будет то, в каталоге с большим кол-вом файлов можно получить переполнение длины параметров, но зато легче. в кавычки пришлось взять чтобы корректно обрабатывать пробелы в дургие символы в имени директории.
    test делает свое дело, и если код возврата был нулевой, тогда выводится строка с echo, если надо имя файла с относительным путем - тогда можно без basename, но тогда всякие ../path/to/back/../../../ будут в имени файла, забыл команду которая преобразует в нормальный путь и имя файла.


    Code:
    ## каталоги
    [me@localhost] Videos $ ./lab.sh Planeta\ 51/ d
    AUDIO_TS
    VIDEO_TS
    
    ## файлы
    [me@localhost] Videos $ ./lab.sh Planeta\ 51/VIDEO_TS f
    VIDEO_TS.BUP
    VIDEO_TS.IFO
    VIDEO_TS.VOB
    VTS_01_0.BUP
    VTS_01_0.IFO
    VTS_01_0.VOB
    VTS_01_1.VOB
    VTS_01_2.VOB
    VTS_01_3.VOB
    VTS_01_4.VOB
    VTS_01_5.VOB
    
    ## сделаю маленькое западло, уберу право чтения с VOB-файлов. 
    [me@localhost] Videos $ chmod -r Planeta\ 51/VIDEO_TS/*.VOB
    
    [me@localhost] Videos $ ./lab.sh Planeta\ 51/VIDEO_TS/ r
    VIDEO_TS.BUP
    VIDEO_TS.IFO
    VTS_01_0.BUP
    VTS_01_0.IFO
    
     
  3. xGOR

    xGOR Elder - Старейшина

    Joined:
    25 Nov 2007
    Messages:
    83
    Likes Received:
    38
    Reputations:
    -5
    Спасибо. Да и ещё одно, какой ключ для скрытых файлов ? Лучше подсчитать сколько их там.
     
    #3 xGOR, 9 May 2010
    Last edited: 9 May 2010
  4. lukmus

    lukmus Elder - Старейшина

    Joined:
    18 Nov 2009
    Messages:
    404
    Likes Received:
    118
    Reputations:
    23
    ls -a
     
  5. xGOR

    xGOR Elder - Старейшина

    Joined:
    25 Nov 2007
    Messages:
    83
    Likes Received:
    38
    Reputations:
    -5
    Как же все таки подсчитать сколько файлов, а не просто выводить их?
     
  6. COMEJIbE

    COMEJIbE New Member

    Joined:
    6 Apr 2010
    Messages:
    18
    Likes Received:
    3
    Reputations:
    0
    если надо посчитать, тогда да... счетчик
    k="0"

    for file in `ls -a "$1"/*`
    do
    test -$2 "$file" && k=$(( k+1 ))
    done
    echo $k
     
  7. xGOR

    xGOR Elder - Старейшина

    Joined:
    25 Nov 2007
    Messages:
    83
    Likes Received:
    38
    Reputations:
    -5
    Не считает )