Назад | Перейти на главную страницу

Скрипты помогают команде НАЙТИ через вывод времени в несколько файлов

вот сценарий, который я написал, и мне нужна помощь. в скрипте я нахожу любой файл, к которому не было доступа более 30 дней, 60, 90, 180, 270 и 365 дней.

Это прекрасно работает. однако это займет несколько дней, чтобы закончить 30-дневную часть. он сканирует NAS. (миллионы и миллионы файлов), как видите, 30-дневная информация действительно содержит все данные, необходимые для остальных скриптов. Часть сценария 60, 90 и т. д. просто повторяет те же усилия, что и 30-дневная часть, за исключением расширенных временных рамок. в этом случае это сэкономит недели повторного сканирования, если каким-то образом части 60, 90 180 и т. д. смогут просто получить свои данные из 30-дневного вывода.

вот где я прошу помощи. вывод аналогичен команде ls -l. и вы также можете видеть из вывода ниже, в этом выводе есть несколько лет. сценарий прилагается и печатается ниже.

total 24
-rw-r--r-- 1 root bin 60 Apr 12 13:07 config_file
-rw-r--r-- 1 root bin 9 Apr 12 13:07 config_file.InProgress
-rw-r--r-- 1 root bin 0 Apr 12 13:07 config_file.sids
-rw-r--r-- 1 root bin 1284 Apr 19 10:41 rpt_file
-rw-r--r-- 1 16074 5003 20083 Apr 26 2002 /nas/quota/slot_2/CR_APP002/eb_ora_bin1/sun8/product/9.2s/oem_webstage/oracle/sysman/qtour/console/dat1_01.gif
-rw-r--r-- 1 16074 5003 20088 Apr 26 2002 /nas/quota/slot_2/CR_APP002/eb_ora_bin1/sun8/product/9.2s/oem_webstage/oracle/sysman/qtour/console/set1_04.gif
-rw-r--r-- 1 16074 5003 2008 Apr 26 2002 /nas/quota/slot_2/CR_APP002/eb_ora_bin1/sun8/product/9.2s/oem_webstage/oracle/sysman/qtour/oapps/get2_03.htm
-rw-r--r-- 1 16074 5003 20083 Apr 26 2002 /nas/quota/slot_2/CR_APP002/eb_ora_bin1/sun8/product/9.2s/oem_webstage/oracle/sysman/qtour/oapps/per1_01.gif

любая помощь приветствуется. это дистрибутивы linux, так что я уверен, что Perl там тоже есть, если нужно.

#!/bin/ksh
############################################
# search shares for files                  #
# that have not been accessed              #
# for a certain time.                      #
# NOTE:                                    #
#    $IN = input search                    #
#    $OUT = output directory for text file #
##########################################################
# TESTS                                                  #
#     Numeric arguments can be specified as              #
#                                                        #
#     +n     for greater than n,                         #
#     -n     for less than n,                            #
#     n      for exactly n.                              #
#                                                        #
#     -atime n                                           #
#            File was last accessed n*24 hours ago.      #
#                                                        #
##########################################################


IN1=/nas/quota/slot_2/CR*
IN2=/nas/quota/slot_3/CR*
IN3=/nas/quota/slot_4/CR*
IN4=/nas/quota/slot_5/CR*
OUT=/nas/quota/slot_3/CR_PRJ144/steve
mkdir ${OUT}
for dir in ${IN1}; do find $dir -atime +30 -exec ls -l '{}' \; >>${OUT}/30days.txt; done
for dir in ${IN2}; do find $dir -atime +30 -exec ls -l '{}' \; >>${OUT}/30days.txt; done
for dir in ${IN3}; do find $dir -atime +30 -exec ls -l '{}' \; >>${OUT}/30days.txt; done
for dir in ${IN4}; do find $dir -atime +30 -exec ls -l '{}' \; >>${OUT}/30days.txt; done
for dir in ${IN1}; do find $dir -atime +60 -exec ls -l '{}' \; >>${OUT}/60days.txt; done
for dir in ${IN2}; do find $dir -atime +60 -exec ls -l '{}' \; >>${OUT}/60days.txt; done
for dir in ${IN3}; do find $dir -atime +60 -exec ls -l '{}' \; >>${OUT}/60days.txt; done
for dir in ${IN4}; do find $dir -atime +60 -exec ls -l '{}' \; >>${OUT}/60days.txt; done
for dir in ${IN1}; do find $dir -atime +90 -exec ls -l '{}' \; >>${OUT}/90days.txt; done
for dir in ${IN2}; do find $dir -atime +90 -exec ls -l '{}' \; >>${OUT}/90days.txt; done
for dir in ${IN3}; do find $dir -atime +90 -exec ls -l '{}' \; >>${OUT}/90days.txt; done
for dir in ${IN4}; do find $dir -atime +90 -exec ls -l '{}' \; >>${OUT}/90days.txt; done
for dir in ${IN1}; do find $dir -atime +180 -exec ls -l '{}' \; >>${OUT}/180days.txt; done
for dir in ${IN2}; do find $dir -atime +180 -exec ls -l '{}' \; >>${OUT}/180days.txt; done
for dir in ${IN3}; do find $dir -atime +180 -exec ls -l '{}' \; >>${OUT}/180days.txt; done
for dir in ${IN4}; do find $dir -atime +180 -exec ls -l '{}' \; >>${OUT}/180days.txt; done
for dir in ${IN1}; do find $dir -atime +270 -exec ls -l '{}' \; >>${OUT}/270days.txt; done
for dir in ${IN2}; do find $dir -atime +270 -exec ls -l '{}' \; >>${OUT}/270days.txt; done
for dir in ${IN3}; do find $dir -atime +270 -exec ls -l '{}' \; >>${OUT}/270days.txt; done
for dir in ${IN4}; do find $dir -atime +270 -exec ls -l '{}' \; >>${OUT}/270days.txt; done
for dir in ${IN1}; do find $dir -atime +365 -exec ls -l '{}' \; >>${OUT}/365days.txt; done
for dir in ${IN2}; do find $dir -atime +365 -exec ls -l '{}' \; >>${OUT}/365days.txt; done
for dir in ${IN3}; do find $dir -atime +365 -exec ls -l '{}' \; >>${OUT}/365days.txt; done

for dir in ${IN4}; do find $dir -atime +365 -exec ls -l '{}' \; >>${OUT}/365days.txt; done

Есть пара проблем со скриптом, из-за которых он работает так медленно. Во-первых, ваш цикл for не нужен, так как он написан, каждая переменная имеет только одно значение, чтобы использовать его так, как вы хотите, вы бы также изменили структуру, чтобы она была примерно такой:

IN_PATH="
/nas/quota/slot_2/CR*
/nas/quota/slot_3/CR*
/nas/quota/slot_4/CR*
/nas/quota/slot_5/CR*
"
OUT=/nas/quota/slot_3/CR_PRJ144/steve
mkdir ${OUT}
for dir in ${IN_PATH}; do find $dir +atime 30
for dir in ${IN_PATH}; do find $dir +atime 60
for dir in ${IN_PATH}; do find $dir +atime 90

и т.д..

Но это по-прежнему заставляет цикл поиска по всей файловой системе NAS указывать каждый файл ... МЕДЛЕННО! Так как мы проверяем время, мы должны проверять файлы, но почему бы не сделать это только один раз? Предполагая, что у вас есть Linux-машина со стандартным GNU, вы найдете должен уметь делать что-то вроде этого:

find /nas/quota/ \(+atime 365 -fls /root/365.txt\), \(+atime 180 -fls /root/180.txt\), etc...

Теперь я делаю это по памяти, поэтому может потребоваться небольшая настройка, чтобы она работала правильно, протестируйте ее в корневом веб-каталоге или в домашнем каталоге, что-то, что работает быстро, чтобы помочь в устранении неполадок. Find будет принимать несколько выражений, и если вы прочитаете разделы о приоритетах на странице руководства, вы сможете заставить его делать некоторые изящные вещи. в зависимости от того, что вы хотите делать с этой информацией, вы также можете добавить ограничения на проверку времени, например:

\(+atime 180 -a -atime 364 -fls /root/more_than_180_but_less_than_365.txt \)

Вам нужен фундаментальный редизайн. Вам следует выполнить команду find только один раз для всей системы и создать для создания индексного файла что-то вроде «file: atime». Вы можете сделать это, используя -printf аргумент найти, чтобы напечатать время с именем файла (см. man find). Затем вы можете выполнять свои операции на основе этого индекса. Причина этого в том, что самым большим штрафом будет указание каждого файла на диске, поэтому вам нужно сделать это только один раз. Это идея, лежащая в основе команд locate и updatedb в Linux. По сути, вы хотите воссоздать их с добавлением времени.

Я также считаю, что перебирать ls - это дерьмо. Вы, вероятно, захотите перебирать индекс построчно с помощью цикла while. Вам придется повторить корректировку этого времени в «х дней назад». Наверное, проще всего будет использовать эпоху. В итоге вы получите что-то вроде:

find ~/scrap -printf "%p:%A@%\n" > index;
while read -d':' name date; do
   if ...between dates using $date...; then
      do something to $name
   fi 
done < index

Если вы хотите, вместо приведенного выше вы должны найти командный канал в цикл while и перенаправить на разные файлы на основе операторов if. Также имейте в виду: это плохой разделитель, если он может использоваться в имени файла.

Возможно, вы захотите сгенерировать индекс в SQL, если хотите стать более привлекательным.

Если потребуется дней просто чтобы завершить часть вашего поиска, это означает, что ваш скрипт зацикливается там, где этого не должно быть. Вдобавок к этому вы снова и снова выполняете рекурсивный поиск ...

Кроме того, попробуйте отформатировать свой пост. Сейчас это похоже на нечитаемый блок текста.