LINUX.ORG.RU

Скрипт создающий копию файлов в ветке директорий


0

0

Есть задание написать скрипт какой раз в месяц должен делать следующее:

Искать в директории и под директориях файл log.txt и переименовывать на файл log1.txt. В будущем месяце операцию повторить. Через три месяца файл удалить log3.txt. При этом при переименовывании файла log.txt в файл log1.txt нужно создать новый файл log.txt. ПодскажЬІте как это сделать. А именно создать файл log.txt . Или ваши предложения. Спасибо.

#!/bin/bash
find ~/http/ -type f -name "log3.txt" -print0 -exec rm -f '{}' \;
find ~/http/ -type f -name "log2.txt" -print0 -exec rename 2 3 '{}' \;
find ~/http/ -type f -name "log1.txt" -print0 -exec rename 1 2 '{}' \; 
find ~/http/ -type f -name "log.txt" -print0 -exec rename log log1 '{}' \;


Последнее исправление: INFINITI (всего исправлений: 1)

Ответ на: комментарий от INFINITI

logrotate умеет переименовывать/упаковывать/удалять логи через заданный промежуток времени/по достижению логом заданного размера. В гугле куча информации по его настройке.

Andrey_Se
()
Ответ на: комментарий от Andrey_Se

Суть даже не в логах. Вместо лог.тхт может быть любой другой файл. И всьо ето надо реализовать спомощю скрипта :) прошу помощи :)

Неужели нельзя создать новый файл лог.тхт там где мы ево переименовуем на лог1.тхт?

Я незнаю баш програмирования потому то и спрашываю.

Чтото на подобе:

[code] find ~/http/ -type f -name «log.txt» -print0 -exec (rename log log1 '{}' \; AND touch -f '{}' \;) [/code]

INFINITI
() автор топика
Ответ на: комментарий от Andrey_Se

>Может, для этих целей лучше использовать logrotate?

0_o мне нравятся линуп^W линуксоиды, у них для всего уже есть ВСЁ!

sniper21 ★★★★★
()
Ответ на: комментарий от INFINITI

INFINITI wrote:

Я незнаю баш програмирования

INFINITI wrote:

Я прошу помоч!

Read «Advanced Bash Scripting Guide», Luke! И русский язык учи заодно.

GotF ★★★★★
()
Ответ на: комментарий от INFINITI

Пиши по-польски, я пойму, и если будет правильно написано - помогу. А вообще учите баш, никакой проблемы написать скрипт нету, все элементарно

Unclown
()
Ответ на: комментарий от Unclown

Witam!

Zadaniem skryptu jest rotowanie plikow logow. Zalozenia dla rotacji są nastepujące:

- Rotowane pliki nazywają się log.txt i znajdują się w katalogu /http i różnych podkatalogach.

- Po pierwszym miesiącu zawartość log.txt zmienią się na log1.txt, a aktualne logi notowane są do pliku log.txt.

- Po drugim miesiącu log1.txt zmienią się na log2.txt, log.txt zmienia się na log1.txt, aktualne logi notowane są w pliku log.txt.

- W trzecim miesiącu log2.txt jest usuwany, log1.txt zmienią się na log2.txt, log.txt zmienią się na log1.txt, aktualne logi notowane są w pliku log.txt.

Dziękuję panu!!

INFINITI
() автор топика
Ответ на: комментарий от INFINITI

видать, таки действительно нужно, и ты таки действительно хотя-бы старался, так что поможем.

 
N=2 
DIR="adir" 
FILE="log.txt" 
 
for file in `find $DIR -name $FILE -type f` 
do 
 
  for i in `seq 0 $N` 
  do 
    mv $file.$i $file.`expr $i + 1` 
  done 
 
  mv $file $file.0 
  rm $file.`expr $N + 1` 
  touch $file 
 
done 

наименование ротированных файлов типа log.txt.0 - стандартно и позволяет красиво обрабатывать файлы скритом. если без него, то прийдется или захардкодживать имена в скрипт, или применять sed для вычленения честей имени.

этот скрипт не тестировался

этот скрипт не будет корректно работать с файлами с пробелами в имени. то же справедливо для папок.

для того, чтобы он выполнялся раз в месяц, добавь его в crontab (или добавь в конец команду sleep, но тогда корректная работа будет нарушена ребутами)

и да, уже есть logrotate =)

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

Цитируем val-amart

N=2  
DIR="adir"  
FILE="log.txt"  
  
for file in `find $DIR -name $FILE -type f`  
do  
  
  for i in `seq 0 $N`  
  do  
    mv "$file.$i" "$file.`expr $i + 1`"  
  done  
  
  mv "$file" "$file.0  "
  rm "$file.`expr $N + 1`"  
  touch "$file"
  
done  

а так - вроде будет корректно с пробелами работать, не проверял

dhameoelin ★★★★★
()
Ответ на: комментарий от dhameoelin

Я так понимаю скрипт делает?

log.txt => log.txt log1.txt => log.txt.0 log2.txt => log.txt.1 log3.txt => log.txt.2

Но надо так как в первом :)

INFINITI
() автор топика
Ответ на: комментарий от dhameoelin

неа, не будет. из-за вот этого:

for file in `find $DIR -name $FILE -type f`

и вообще, я планировал оставить это на домашнее задание.

val-amart ★★★★★
()
Ответ на: комментарий от INFINITI

чяво? давай еще раз, и по-русски с дубляжом по-польски ;)

val-amart ★★★★★
()
Ответ на: комментарий от INFINITI

ааа, понял. не. скрипт делает:

log.txt => log.txt.0
log.txt.0 => log.txt.1
log.txt.1 => log.txt.2
log.txt.2 => log.txt.3

rm log.txt.3
touch log.txt

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

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

Структура имени файла не та что должна быть!

Вместо log1.txt получаем log.txt.1

Цыфра 1 не на нужном мне месте :(

INFINITI
() автор топика
Ответ на: комментарий от INFINITI

ты читать умеешь? я все в своем сообщении обьяснил. или седа ты тоже не знаешь? короче, меньше прогуливать надо было.

val-amart ★★★★★
()
Ответ на: комментарий от INFINITI

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

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

У меня проблемы с руским! А прогуливать небыло что! У меня небыло выкладов по баш програмированию ... никогда!

INFINITI
() автор топика
Ответ на: комментарий от INFINITI

команда touch создаст тебе файлик. как обойти все папки см. мой скрипт выше

val-amart ★★★★★
()
Ответ на: комментарий от INFINITI

так а нафига тогда тебе это? не преподавали, а требуют? абсурд. производственная необходимость? используй логротейт. непонятно.

val-amart ★★★★★
()
Ответ на: комментарий от INFINITI

Суть даже не в логах. Вместо лог.тхт может быть любой другой файл.

logrotate все равно какие файлы, задаешь нужную маску(и) и вперед.

urlin
()
Ответ на: комментарий от val-amart

Цитируем val-amart

неа, не будет. из-за вот этого:

 
for file in `find $DIR -name $FILE -type f`

и вообще, я планировал оставить это на домашнее задание.

хм, пропустил))

dhameoelin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.