Давайте кодить на bash

  • Привет!
    Для полноценного и удобного использования всего форумного функционала рекомендуем зарегистрироваться на игровом сервере и форуме, после чего привязать игровой аккаунт к форумному.

Мистер чере

Участник
1
35
13
Скрипт, позволяющий очищать папку от устаревших файлов.
Может удалять файлы до определенной пользователем даты, либо удалять самые старые файлы, пока в папке не останется указанное пользователем количество файлов.
Все действия логируются в файл, находящийся в том же месте, где расположен скрипт.


#!/bin/bash

# Проверяем существование файла лога и создаем его, если он не существует
log_file="DelLog_$(date +'%Y.%m.%d_%H-%M-%S').log"
sudo touch "$log_file"

# Функция для записи в файл лога
log_msg() {
echo "$(date) $1" >> "$log_file"
}

# Выбор режима работы
read -p "Выберите режим работы (1 - удаление данных до определенной даты, 2 - удаление самых старых файлов): " mode

if [ "$mode" == "1" ]; then
# Удаление данных до определенной даты режим

log_msg "Выбран режим удаления данных до определенной даты."

# Пользователь вводит путь к папке
read -p "Введите путь к папке: " directory
ls -la $directory --sort time
log_msg "Выбрана папка $directory"

# Пользователь вводит дату в формате YYYY-MM-DD
read -p "Введите дату в формате YYYY-MM-DD: " date

# Проверяем, существует ли указанная папка
if [ ! -d "$directory" ]; then
echo "Указанная папка не существует"
log_msg "Выбрана неверная папка."
exit 1
fi

# Удаляем файлы, созданные до указанной даты
find "$directory" -type f ! -newermt "$date" -exec sudo rm {} \;

echo "Удаление файлов до $date завершено"
log_msg "Удалены файлы до $date"
ls -la $directory --sort time

elif [ "$mode" == "2" ]; then
# Удаление самых старых файлов до определенного количества режим

log_msg "Выбран режим удаления самых старых файлов до определенного количества."

# Пользователь вводит путь к папке
read -p "Введите путь к папке: " directory
log_msg="Выбрана папка $directory"
ls -la $directory --sort time
# Пользователь вводит количество файлов для удаления
read -p "Введите количество файлов, которое останется после удаления: " file_count

# Проверяем, существует ли указанная папка
if [ ! -d "$directory" ]; then
log_msg "Указанная папка $directory не существует"
echo "Указанная папка не существует"
exit 1
fi

# Удаляем старые файлы пока количество файлов в папке не будет равно file_count
while [ "$(ls -A "$directory" | wc -l)" -gt "$file_count" ]; do
oldest_file=$(ls -t "$directory" | tail -1)
rm "$directory/$oldest_file"
log_msg "Удален файл: $oldest_file"
done
log_msg="В папке осталось $file_count файлов, остальные удалены"
echo "Удаление самых старых файлов завершено, папка содержит $file_count файлов"
ls -la $directory --sort time

else
log_msg "Некорректный режим работы, пожалуйста, выберите 1 или 2"
echo "Некорректный режим работы, пожалуйста, выберите 1 или 2"
fi


Для проверки скрипта выше, прилагаю скрипт, который автоматически генерирует в указанной папке файлы с случайной датой.

#!/bin/bash

# Указываем путь к папке, где будут создаваться файлы
read -p "Укажите папку для создания: " folder_path

# Указываем количество файлов, которые нужно создать
read -p "Укажите кол-во файлов " num_files

# Генерируем указанное количество пустых файлов с расширением .log
for ((i=1; i<=$num_files; i++))
do
# Генерируем случайную дату от 2000 года до 2024 года
random_year=$(shuf -i 2000-2024 -n 1)
random_month=$(shuf -i 1-12 -n 1)
random_day=$(shuf -i 1-28 -n 1) # Учитывая февраль
random_timestamp=$(date -d "$random_year-$random_month-$random_day" +%s)

# Создаем файл с расширением .log
touch "$folder_path/file_$i.log"

# Меняем дату создания файла
touch -d@"$random_timestamp" "$folder_path/file_$i.log"
done