Не удалось получить необходимые выходные данные из команд поиска

#shell

Вопрос:

У меня есть два каталога ${WEB_HOME}/резервное копирование/csv и $(WEB_HOME)/главная/архивы в разделе PURGE_DIR_PATH, в основном я хочу найти и удалить все файлы старше 60 дней и сжать файлы старше 30 дней, но менее 60 дней. Проблема, с которой я сталкиваюсь здесь, заключается в том, что find не предоставляет мне файлы из обоих каталогов, Когда я повторяю за циклом for и если цикл, я могу видеть, как оба пути(имя dir_name) записываются в файл журнала, но каким-то образом он не проходит должным образом, так как в выводе я вижу файлы журнала только из одного каталога, который находится в $(WEB_HOME)/home/архивы.

 #!/bin/bash

export LOG_RETENTION=60
export LOG_COMPRESS=30
export WEB_HOME="/web/local/artifacts"
export CURR_DT=`date  %Y%m%d`
LOG_FILE="/tmp/script_${CURR_DT}.log"
export PURGE_DIR_PATH="${WEB_HOME}/backup/csvs  ${WEB_HOME}/home/archives"


    for dir_name in ${PURGE_DIR_PATH}
      do
        echo "inside for loop"
        echo "dirname=${dir_name}"
        if [[ -d "${dir_name}" ]] 
        then
        echo "inside IF loop"
        echo "${dir_name} exists on the filesysetm." >> ${LOG_FILE}
        echo "csv Files older than ${LOG_RETENTION} days to be removed: " >> ${LOG_FILE}
          find ${dir_name}  -type f -name "*.csv" -o -name "*.log*" -mtime  ${LOG_RETENTION} -exec ls -l {} ; >> ${LOG_FILE}
          #find ${dir_name}  -type f -name "*.csv" -o -name "*.log*" -mtime  ${LOG_RETENTION} -exec rm | xargs rm {} ; >> ${LOG_FILE}
          echo "csv Files older than ${LOG_COMPRESS} to be compressed: " >> ${LOG_FILE}
          find ${dir_name}  -type f -name "*.csv"  -o -name "*.log*" -mtime  ${LOG_COMPRESS} -exec ls -l {} ; >> ${LOG_FILE}
          #find ${dir_name}  -type f -name "*.csv"  -o -name "*.log*" -mtime  ${LOG_COMPRESS} -exec gzip {} ;
        fi
    done
 

Ответ №1:

Пара вещей:

Во-первых, предложения » ИЛИ » должны быть заключены в скобки. Команда find обрабатывает все условия как И. Так что попробуйте это:

 find ${dir_name}  -type f ( -name "*.csv" -o -name "*.log*" ) -mtime  ${LOG_RETENTION} -exec ls -l {} ; >> ${LOG_FILE}
 

Во-вторых, эта строка искажена с помощью «- exec rm» и канала для xargs:

 find ${dir_name}  -type f -name "*.csv" -o -name "*.log*" -mtime  ${LOG_RETENTION} -exec rm | xargs rm {} ; >> ${LOG_FILE}
 

Я подозреваю, что вы имели в виду что-то вроде этого:

 find ${dir_name}  -type f ( -name "*.csv" -o -name "*.log*" ) -mtime  ${LOG_RETENTION} -print | xargs rm {} ;
 

И еще одно… Вы можете получить отказ gzip при попытках двойного сжатия *.log.gz файлы из-за конечной звездочки на этой находке:

 find ${dir_name}  -type f ( -name "*.csv"  -o -name "*.log*" ) -mtime  ${LOG_COMPRESS} -exec ls -l {} ; >> ${LOG_FILE}
 

Это работает для сопоставления старых файлов, которые вы хотите удалить, но для шага сжатия вам, вероятно, потребуется: -имя «*.log»

Комментарии:

1. я прокомментировал строки, в которых есть rm, я все еще тестирую первую команду поиска, в которой перечислены все файлы из обоих каталогов, она отображает файлы только из одного каталога, я прокомментировал строку, как вы можете видеть. Не уверен, что я иду не так

2. Также он отображает файлы дважды из одного и того же каталога . должно было отображаться 16 файлов, но вместо выбора из другого каталога отображаются 32

3. Ответ дополнен дополнительными предложениями.

4. спасибо за ответ, находки работают, но если я удалю * после регистрации, файл не будет сжиматься для следующего формата даты —> test.log.2021-04-15. Если я поставлю * , это приведет к ошибке для других файлов, говорит file.gz уже имеет суффикс .gz. Как я могу с этим справиться? Пожалуйста, дайте мне знать. найдите ${имя файла} -введите f ( -имя » .csv» -o -имя » .log» ) -mtime ${СЖАТИЕ ЖУРНАЛА} -exec ls -l {} ; >>> ${ФАЙЛ ЖУРНАЛА}