Переместить файлы журнала в папку архива по дате, но не последний файл журнала для каждого процесса - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть эти файлы, [processName.DateTime.out]

/stev/log: ls -al

drwxrwxr-x    1 user.stev           user         4096 Feb  5 23:59 .
drwxrwxr-x    1 user.stev           user         4096 Feb  5 23:59 ..
-rw-rw-r--    1 user.stev           user         4096 Jan 21 23:59 AAA01.202002010000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 22 23:59 AAA01.202002020000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 23 23:59 AAA01.202002030000.out
-rw-rw-r--    1 user.stev           user         4096 Feb  1 23:59 BBB01.202002010000.out
-rw-rw-r--    1 user.stev           user         4096 Feb  2 23:59 BBB01.202002020000.out
-rw-rw-r--    1 user.stev           user         4096 Feb  3 23:59 BBB01.202002030000.out
-rw-rw-r--    1 user.stev           user         4096 Feb  1 23:59 DDD01.202002010000.out
-rw-rw-r--    1 user.stev           user         4096 Feb  2 23:59 DDD01.202002020000.out
-rw-rw-r--    1 user.stev           user         4096 Feb  3 23:59 DDD01.202002030000.out
-rw-rw-r--    1 user.stev           user         4096 Feb  1 23:59 TEST01.202002010000.out
-rw-rw-r--    1 user.stev           user         4096 Feb  2 23:59 TEST01.202002020000.out
-rw-rw-r--    1 user.stev           user         4096 Feb  3 23:59 TEST01.202002030000.out
-rw-rw-r--    1 user.stev           user         4096 Feb  1 23:59 TEST02.202002010000.out
-rw-rw-r--    1 user.stev           user         4096 Feb  2 23:59 TEST02.202002020000.out
-rw-rw-r--    1 user.stev           user         4096 Feb  3 23:59 TEST02.202002030000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 21 23:59 TEST03.202002010000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 22 23:59 TEST03.202002020000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 23 23:59 TEST03.202002030000.out

И мой сценарий перемещает некоторые файлы в папку архива, если он был изменен до 7 дней.

sfind . -type f -mtime +7 -name "/stev/log" | while read FNAME
    do
        echo " moving file: " ${FNAME}      >> /stev/archive/archiveLog.log
        PCMD="mv ${FNAME} /stev/archive}"
        echo "PCMD=${PCMD}"                 >> /stev/archive/archiveLog.log
        eval "${PCMD}"                      >> /stev/archive/archiveLog.log
        echo ""                             >> /stev/archive/archiveLog.log
    done

этот скрипт перечислит файлы ниже и затем переместит их в папку архива [Текущая дата: 5 февраля]

-rw-rw-r--    1 user.stev           user         4096 Jan 21 23:59 AAA01.202002010000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 22 23:59 AAA01.202002020000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 23 23:59 AAA01.202002030000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 21 23:59 TEST03.202002010000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 22 23:59 TEST03.202002020000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 23 23:59 TEST03.202002030000.out

Но дело в том, что я должен оставаться последними файлами для каждого процесса.

Например) Я могу перемещать файлы ниже

-rw-rw-r--    1 user.stev           user         4096 Jan 21 23:59 AAA01.202002010000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 22 23:59 AAA01.202002020000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 21 23:59 TEST03.202002010000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 22 23:59 TEST03.202002020000.out

, но я должен оставаться ниже файлов (не имеет значения, сколько дней нужно go для последнего файла для каждого процесса. )

-rw-rw-r--    1 user.stev           user         4096 Jan 23 23:59 AAA01.202002030000.out
-rw-rw-r--    1 user.stev           user         4096 Jan 23 23:59 TEST03.202002030000.out

Есть ли хорошая идея для этой проблемы ??

1 Ответ

0 голосов
/ 06 февраля 2020

Думайте в bash как в «потоках» - что-то входит, что-то выходит.

# find all files
find /stev/log -type f -mtime +7 |
# extract the part before dot
cut -d. -f1 |
# for each process
# could be transformed into `xargs sh -c '...' --` for speed
while IFS= read -r process; do
    # all files with this process
    find /stev/log -type f -mtime +7 -name "$process*" |
    # sort numerically second field behind dot
    sort -t. -n -k2 |
    # remove last file, because we don't want to move it
    # maybe you need to remove first line, then just sort -r, check it
    head -n -1
done |
# mv each file into /stev/archive
xargs -d$'\n' -I{} mv -v {} "/stev/archive" >> /stev/archive/archiveLog.log

Передайте -t опцию xargs для отладки.

...