shell - 无法从 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
解决方案
有几件事:
首先,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"
推荐阅读
- angular - 无法在角度 9 中将值从父组件传递到子组件
- python-3.x - 仅保留日期为整小时的数据框行
- java - 如何在 JUnit @Before 方法和测试方法中使用 EasyMock 对象
- reactjs - 无法从 Express 服务器获取数据到 React
- linux - 关于在shell编程中保存表达式的值
- mysql - 安装 MySQL 但进入应用配置时无法启动服务器
- julia - Julia中的滑动窗口功能
- r - 如何将变量添加到 R 中的字符串中?我基本上是在尝试参数化字符串,就像在 SQL 中一样
- python - 如何在 Trie 中进行深度搜索?
- sql - 将值替换为不同的值