Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Помогите дописать скрипт на баше  (Прочитано 744 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Mr. Metal Head

  • Автор темы
  • Любитель
  • *
  • Сообщений: 51
    • Просмотр профиля
Помогите дописать скрипт на баше
« : 19 Август 2016, 20:28:54 »
Здравствуйте! Нужно написать довольно простой скрипт на bash, который будет удалять самый старый файл в указанной папке, если диск заполнен более чем на сколько-то процентов.

Сам я ни разу не писал ничего подобного, но тут жизнь заставила.

Сейчас у меня следующая реализация:

#!/bin/bash
FILESYSTEM=/dev/sda1 # or whatever filesystem to monitor
CAPACITY=90 # delete if FS is over 90% of usage
CACHEDIR=/home/user/lotsa_cache_files/ #mount point

# Proceed if filesystem capacity is over than the value of CAPACITY (using df POSIX syntax)
# using [ instead of [[ for better error handling.
if [ $(df -P $FILESYSTEM | awk '{ gsub("%",""); capacity = $5 }; END { print capacity }') -gt $CAPACITY ]
then
    cd ${CACHEDIR}
    rm ./*(Om[1])
fi

Главная проблема - ошибка при запуске:

Syntax error: "(" unexpected (expecting "fi")

Не понимаю, почему он там ругается.

Заранее спасибо за помощь!
« Последнее редактирование: 19 Август 2016, 20:32:26 от Mr. Metal Head »

Punko

  • Гость
Re: Помогите дописать скрипт на баше
« Ответ #1 : 19 Август 2016, 21:58:18 »
Mr. Metal Head,что это за макароны в условии?
Сделайте переменную, например,
CURRENT_CAPACITY=(df -P $FILESYSTEM | awk '{ gsub("%",""); capacity = $5 }; END { print capacity }'(команду скопипастил с вашего скрипта, не проверял).
И вот в условии уже сравнивайте CAPACITY -lt CURRENT_CAPACITY, например,  так:

if [ ${CAPACITY} -lt ${CURRENT_CAPACITY} ]
then
do some code
fi


если не получится, тогда сразу после инициализации переменных сделайте вывод каждой через echo:

echo ${CURRENT_CAPACITY}
и смотрите на результат.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Помогите дописать скрипт на баше
« Ответ #2 : 19 Август 2016, 22:03:57 »
а что это вообще такое
Цитировать
rm ./*(Om[1])

Пользователь добавил сообщение 19 Август 2016, 22:09:14:
CURRENT_CAPACITY=$(df /dev/sda1 | sed -rn '$s/.* ([0-9]+)%.*/\1/p')
« Последнее редактирование: 19 Август 2016, 22:09:14 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Mr. Metal Head

  • Автор темы
  • Любитель
  • *
  • Сообщений: 51
    • Просмотр профиля
Re: Помогите дописать скрипт на баше
« Ответ #3 : 19 Август 2016, 22:37:31 »
Mr. Metal Head,что это за макароны в условии?
Сделайте переменную, например,
CURRENT_CAPACITY=(df -P $FILESYSTEM | awk '{ gsub("%",""); capacity = $5 }; END { print capacity }'(команду скопипастил с вашего скрипта, не проверял).
И вот в условии уже сравнивайте CAPACITY -lt CURRENT_CAPACITY, например,  так:

if [ ${CAPACITY} -lt ${CURRENT_CAPACITY} ]
then
do some code
fi


если не получится, тогда сразу после инициализации переменных сделайте вывод каждой через echo:

echo ${CURRENT_CAPACITY}
и смотрите на результат.


Попробовал. Получилась ошибка Illegal number в строке 10.

Вот тестовый код

#!/bin/bash
FILESYSTEM=/dev/sda1 # or whatever filesystem to monitor
CAPACITY=90 # delete if FS is over 90% of usage
CACHEDIR=/home/user/lotsa_cache_files/ #mount point

# Proceed if filesystem capacity is over than the value of CAPACITY (using df POSIX syntax)
# using [ instead of [[ for better error handling.
CURRENT_CAPACITY=CURRENT_CAPACITY=$(df /dev/sda1 | sed -rn '$s/.* ([0-9]+)%.*/\1/p')
echo ${CURRENT_CAPACITY}
if [ ${CAPACITY} -lt ${CURRENT_CAPACITY} ]
then
echo "test"
fi

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Помогите дописать скрипт на баше
« Ответ #4 : 19 Август 2016, 22:40:55 »
CURRENT_CAPACITY=CURRENT_CAPACITY=$(df /dev/sda1 | sed -rn '$s/.* ([0-9]+)%.*/\1/p')
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Punko

  • Гость
Re: Помогите дописать скрипт на баше
« Ответ #5 : 19 Август 2016, 22:41:37 »
Mr. Metal Head, посмотри на инициализацию:


Цитировать
CURRENT_CAPACITY=CURRENT_CAPACITY=$(df /dev/sda1 | sed -rn '$s/.* ([0-9]+)%.*/\1/p')

Убери лишак и снова в бой :)

Оффлайн Mr. Metal Head

  • Автор темы
  • Любитель
  • *
  • Сообщений: 51
    • Просмотр профиля
Re: Помогите дописать скрипт на баше
« Ответ #6 : 19 Август 2016, 22:45:26 »
CURRENT_CAPACITY=CURRENT_CAPACITY=$(df /dev/sda1 | sed -rn '$s/.* ([0-9]+)%.*/\1/p')

Спасибо! Поспешил :) Теперь заработало условие, осталось написать удаление.

Этот вариант я нашёл в глубинах интернета, но не совсем понимаю как в данном случае указать конкретную папку, а не текущий каталог.
В описании было указано, что O - это сортировка файлов, а [1] - это 1 элемент в последовательности.
rm ./*(Om[1])

Punko

  • Гость
Re: Помогите дописать скрипт на баше
« Ответ #7 : 19 Август 2016, 22:51:00 »

Этот вариант я нашёл в глубинах интернета, но не совсем понимаю как в данном случае указать конкретную папку, а не текущий каталог.


в баше можно передать как параметр конкретную директорию.

DIRECTORY=$1присвоит переменной значение первого аргумента. То есть, если запускать скрипт так:
my_script.sh /home/username/videoто в переменной DIRECTORY будет указанный путь.

потом просто:

rm -f ${DIRECTORY}/file_to_del
Это если путь абсолютный. Если вам надо указать путь относительный, тогда добавьте / перед переменной:
rm -f /${DIRECTORY}/file_to_del

Если передавать путь не нужно (например, он всегда один и тот же), то можно прямо
rm -f /path/to-fileзахардкодить.

Оффлайн Mr. Metal Head

  • Автор темы
  • Любитель
  • *
  • Сообщений: 51
    • Просмотр профиля
Re: Помогите дописать скрипт на баше
« Ответ #8 : 19 Август 2016, 22:54:35 »
Это понятно, проблема в другом. Нужно удалить 1 самый старый файл (по времени создания) в каталоге, имена файлов могут отличаться.
Я пробую что-то вроде

rm -f ${CACHEDIR}(Om[1])
Но тогда возникает та же ошибка, что и в первом сообщении.
« Последнее редактирование: 19 Август 2016, 23:00:27 от Azure »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Помогите дописать скрипт на баше
« Ответ #9 : 19 Август 2016, 22:56:03 »
Удалить самый старый (по дате изменения) файл в директорииrm ${DIRECTORY}/$(ls -t ${DIRECTORY} | tail -1)
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Mr. Metal Head

  • Автор темы
  • Любитель
  • *
  • Сообщений: 51
    • Просмотр профиля
Re: Помогите дописать скрипт на баше
« Ответ #10 : 19 Август 2016, 22:58:36 »
Отлично!

Теперь всё заработало!

Спасибо, Azure и Punko!

Вот получившийся код:

#!/bin/bash
FILESYSTEM=/dev/sda1 # or whatever filesystem to monitor
CAPACITY=50 # delete if FS is over 90% of usage
DIRECTORY=/home/user/rm_test/ #mount point

# Proceed if filesystem capacity is over than the value of CAPACITY (using df POSIX syntax)
# using [ instead of [[ for better error handling.
CURRENT_CAPACITY=$(df /dev/sda1 | sed -rn '$s/.* ([0-9]+)%.*/\1/p')
echo ${CURRENT_CAPACITY}
if [ ${CAPACITY} -lt ${CURRENT_CAPACITY} ]
then
rm ${DIRECTORY}/$(ls -t ${DIRECTORY} | tail -1)
fi

Punko

  • Гость
Re: Помогите дописать скрипт на баше
« Ответ #11 : 19 Август 2016, 22:59:52 »
Azure,
rm ${DIRECTORY}/$(ls -t ${DIRECTORY} | tail -1)
ГЕНИАЛЬНО!!
Я решал подобную задачу месяца три назад, ТАКИХ костылей нагородил!

Mr. Metal Head, пожалуйста! :)

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
Re: Помогите дописать скрипт на баше
« Ответ #12 : 20 Август 2016, 22:20:49 »
ls -t кроме файлов выводит также и директории, что не нужно и может вызвать ошибку rm.

удалить самый старый файл:
rm "$(LC_ALL=C stat -c '%F %Y %n' "$DIRECTORY"/* | grep '^regular file ' | sort -nk3 | cut -d ' ' -f4- | line)"
« Последнее редактирование: 22 Август 2016, 10:59:02 от renzrv »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Помогите дописать скрипт на баше
« Ответ #13 : 21 Август 2016, 10:39:27 »
renzrv, задачу можно решать по-разному, но Вы, на мой взляд, чересчур усложняете:rm "${DIRECTORY}/$(ls -t --group-directories-first ${DIRECTORY} | tail -1)"Если уж не использовать стандартныеrm "${DIRECTORY}/$(ls -rtp ${DIRECTORY} | grep -vm 1 '/$')"
« Последнее редактирование: 21 Август 2016, 10:41:00 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
Re: Помогите дописать скрипт на баше
« Ответ #14 : 21 Август 2016, 19:01:37 »
Да длиновато. Я просто лс как-то не доверяю- то размеры выводит не правильные,
то еще что, может и даты, а стат внушает доверие.
« Последнее редактирование: 21 Август 2016, 19:03:18 от renzrv »

 

Страница сгенерирована за 0.059 секунд. Запросов: 24.