首页 > 解决方案 > 无法从 find 命令获得所需的输出

问题描述

我在 PURGE_DIR_PATH 下有两个目录 ${WEB_HOME}/backup/csvs 和 $(WEB_HOME)/home/archives,基本上是想找到并删除所有超过 60 天的文件,并压缩超过 30 天但小于 60 天的文件。我在这里面临的问题是 find 没有给我两个目录中的文件,当我在 for 循环和 if 循环之后回显时,我能够看到两个路径(dir_name)都被写入 LOG_FILE 但不知何故它没有循环通过与输出一样,我只能从 $(WEB_HOME)/home/archives 的一个目录中看到日志文件。

#!/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

标签: shell

解决方案


有几件事:

首先,OR 子句需要用括号括起来。find 命令将所有条件视为 AND。所以试试这个:

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 {} \;

而且,还有一件事......由于此发现的尾随星号,您可能会在尝试双重压缩 *.log.gz 文件时遇到 gzip:

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

它适用于匹配您要删除的旧文件,但对于压缩步骤,您可能需要:-name "*.log"


推荐阅读