#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 {} ; >>> ${ФАЙЛ ЖУРНАЛА}