Зациклилось

Модератор: Модераторы разделов

Ответить
Anonymouss
Сообщения: 6

Зациклилось

Сообщение Anonymouss »

Господа, кто может помочь?
Написал скрипт, который должен выдавать самый старый файл, но при его выполнении терминал ожидает ввода. Это от того,что зациклилось, или еще от чего-то? В общем, помогите, пожалуйста.


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

#!/bin/bash
find $@ -type f  > text.tmp
old=` sed '1!d' text.tmp `
#echo $old
i=2
#echo $i
amount=`wc -l text.tmp|awk '{print $1}'` # количество строк
up=`expr $amount + 1`
new=` sed '$i!d' text.tmp `

while [ "$i" -lt "$up" ]
do
if [ "$old" -ot "$new" ]
then
i=`expr $i + 1`
new=` sed '$i!d' text.tmp `
else
old=$new
i=`expr $i + 1`
new=` sed '$i!d' text.tmp `
fi
done
ls -l $old|awk '{print $9,$6,$7,$8}'


exit
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Зациклилось

Сообщение Bizdelnick »

Во-первых, отформатируйте код так, чтобы его можно было читать.
Во-вторых, тут у Вас опечатка:
Anonymouss писал(а):
16.12.2016 20:02
if [ "$old" -ot "$new" ]

В-третьих, я Вам уже говорил, что парсить вывод ls — занятие крайне неблагодарное. Для получения времени модификации файла используйте date или stat.
В-четвёртых, число строк в выводе find не обязательно должно совпадать с числом файлов, потому что в именах файлов могут быть переводы строки (и ещё масса весёлых символов).
В-пятых, временный файл не особо нужен. Все данные можно хранить в переменных.
В-шестых, вот тут awk не нужен:
Anonymouss писал(а):
16.12.2016 20:02
amount=`wc -l text.tmp|awk '{print $1}'` # количество строк
потому что ничего не меняет.
Пожалуй, хватит пока...
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Anonymouss
Сообщения: 6

Re: Зациклилось

Сообщение Anonymouss »

Спасибо,
В чем именно опечатка? Там должно стоять -ot, это там и стоит.

Date же, кажется, не выводит время модификации файла, разве нет? Stat -да, работает.
Не могли бы Вы ответить, почему при запуске скрипта терминал ждет ввода, а не показывает файл? - этот вопрос меня интересует больше всего, но спасибо Вам и за остальные комментарии по поводу программы.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Зациклилось

Сообщение Bizdelnick »

А, действительно, проглядел по диагонали и не въехал, что происходит. А про -ot вообще не знал, потому как это башизм.
И вот тут пару ошибок не заметил:
Anonymouss писал(а):
16.12.2016 20:02
new=` sed '$i!d' text.tmp `
Anonymouss писал(а):
16.12.2016 20:02
new=` sed '$i!d' text.tmp `

В одинарных кавычках переменная не раскроется.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Зациклилось

Сообщение SLEDopit »

А если почитать man find чуток внимательнее, то можно не мучаться и просто обойтись одностроком:

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

find $@ -type f -printf '%T+ %p\n' | sort | head -1
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Anonymouss
Сообщения: 6

Re: Зациклилось

Сообщение Anonymouss »

Мне кажется я в психушку попаду со всем этим: стараюсь, несколько часов что-то придумываю, потом оказывается, что все решается одной строчкой или вообще одной командой.
Спасибо вам огромное
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Зациклилось

Сообщение Bizdelnick »

Ну это тоже не идеальное решение. Во-первых, если среди аргументов скрипта попадутся такие, которые find может принять за часть выражения (каталог, имя которого начинается с дефиса), он выдаст ошибку. А во-вторых, опция -printf нестандартная, так что скрипт не будет переносимым (хотя я понятия не имею, имеет ли это для Вас какое-то значение).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить