1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Шелл-скрипт

Тема в разделе "Софт", создана пользователем Rem, 13.01.03.

  1. Rem

    Rem Активный

    4.704
    0
    Кто у нас тут специалист по шелл-скриптингу? Подскажите, плиз. Нужно по ФТП утаскивать один файл из каталога. Самый последний по дате. Файлов в каталоге много. Если критично - os Sun Solaris.
     
  2. Vaulter

    Vaulter Активный участник

    1.622
    0
  3. OEM

    OEM Почётный

    2.957
    0
    Rem
    Спроси у Пашки, он наверняка поможет. Я не думаю, что это дико сложно.
     
  4. Rem

    Rem Активный

    4.704
    0
    Да я нашел уже.

    #!/bin/ksh
    #

    for fn in $(ls -t -1); do
    rm lastbackup
    ln -s $fn lastbackup
    break
    done
     
  5. OEM

    OEM Почётный

    2.957
    0
    Rem
    Даже с моими знаниями выглядит просто и изящно.
     
  6. andrews

    andrews Участник

    153
    0
    а break тут зачем ?

    Добавление от [date]1043257191[/date]:
    patchdiag.xref чтоли тянуть каждый день ? ;)
     
  7. Rem

    Rem Активный

    4.704
    0
    Чтобы прервать цикл. Нужен только самый последний по дате файл. То есть в данном исходнике - самый первый в списке, формируемом $(ls -t -1)
     
  8. andrews

    andrews Участник

    153
    0
    я сейчас уссусь со смеху ;)
    rm `ls -t -1 | head -1` - вместо всего этого ;)
    писатели ;)
     
  9. Rem

    Rem Активный

    4.704
    0
    Ну, на здоровье. Только сначала выполни то, что написал под Солярисом. И вообще-то нужно было не удалять, а получить последний файл, с которым что-то потом делать.
     
  10. andrews

    andrews Участник

    153
    0
    ладно ;) без обид ;) ok ?
    любым из клонов sh (будь то сам sh, bash или ksh) после выполнения:
    FILENAME=`ls -t1|head -1`
    пременная FILENAME будет содержать то, что тебе нужно ;-)
    другими словами весь твой скрипт можно переписать (с моей точки зрения) в виде:
    ---------------------------------
    #!/bin/ksh
    rm lastbackup
    ln -s `ls -t1|head -1` lastbackup
    ---------------------------------
    что касается конструкции $(bla-bla), то она не совсем всегда делает то, что нужно ;) вместо нее лучше использовать `bla-bla` - так надежнее и одинаково интерпретируется разнвми *sh ;)
    что касается sun solaris, то я уже около 2-х лет пишу под эту платформу и не только на sh/bash/ksh ;)
    еще вопросы ? ;)
     
  11. Rem

    Rem Активный

    4.704
    0
    После некоторых размышлений решил, что, к сожалению, все вышеперечисленные методы не годятся. В изначальной постановке вопроса не учтено (точнее не озвучено) что пополнение директории процесс динамический - т.е. вполне можно получив последний по времени файл попасть на тот, которой в данный момент записывается и следовательно inconsistent. В этом случае нужно брать предидущий. С одной стороны, проще всего было бы создавать линк на последний файл именно в том процессе, который его создает. После завершения. Это реализуемо. Но тогда возникает другой вопрос - как поведет себя процесс, создающий линк, если в этот момент подлинкованый файл копируется по фтп?
     
  12. Bob

    Bob Активный

    21.804
    0
    Rem, я с тебя дивлюсь! Ну возьми напиши маленькую прогу на Си. Займет 10 строк. Или у тебя компилятора нету.
     
  13. Rem

    Rem Активный

    4.704
    0
    Нету там компилятора, нету. Насколько я помню, он в солярисе по умолчанию не ставится. А может админ не поставил. Короче - нету. Проект удаленный (ну очень удаленный... telnet & vi - все что имею) И тот, кто отвечает за админство и скриптинг куда-то провалился...
     
  14. Bob

    Bob Активный

    21.804
    0
    , вообще то да не ставится.
     
  15. andrews

    andrews Участник

    153
    0
    я так понимаю, что ты имеешь ввиду, что предыдущий файл копируется по ftp. если ты изменишь символическую ссылку на другой файл в момент копирования, то у тебя все равно скопируется старый файл - собственно имя файла используется только в начале процесса копирования - чтобы определить inode ;) а вот если ты сотрешь старый файл, то будет геморрой ;)
     
  16. andrews

    andrews Участник

    153
    0
    в комплекте с solaris компилятор вообще не поставляется ;) нужно либо брать gcc с компаньён CD, либо брать сановский компилятор (это называется Sun WorkShop или Forte) и 30-дневную лицензию к нему, либо (что лучше) собрать gcc самому там ;)