首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在crontab作业中将*替换为文件名

为什么在crontab作业中将*替换为文件名
EN

Unix & Linux用户
提问于 2020-04-19 08:33:10
回答 2查看 105关注 0票数 -3

我的干净的码头日志脚本如下(CentOS 7):

代码语言:javascript
复制
#!/usr/bin/env bash

set -uex

echo "======== start clean docker containers logs ========"  
logs=$(find /var/lib/docker/ -type f -name *.log -size +25M)  
for log in $logs  
  do  
    echo "clean logs : $log"  
    cat /dev/null > $log  
  done  
logsrm=$(find /var/lib/docker/ -mtime +7 -name *.log -type f)  
for logm in $logsrm  
  do  
    echo "delete logs : $logm"  
    cat /dev/null > $logm
  done
echo "======== end clean docker containers logs ========"

当我使用crontab执行它时:

代码语言:javascript
复制
*/1 * * * * root /data/scripts/docker-clean.sh >> $HOME/cron.log 2>&1

输出日志如下:

代码语言:javascript
复制
[root@uat-k8s-01 ~]# tail -f cron.log
++ find /var/lib/docker/ -type f -name cron.log cront.log -size +25M
find: paths must precede expression: cront.log
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
+ logs=
+ echo '======== start clean docker containers logs ========'
======== start clean docker containers logs ========
++ find /var/lib/docker/ -type f -name cron.log cront.log -size +25M
find: paths must precede expression: cront.log
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
+ logs=

我该怎么做才能让它正常工作?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2020-04-19 08:36:25

正如我在对你之前的问题的答复中提到的,在调用find之前,必须引用模式*.log来阻止D2将模式扩展为当前目录中的名称。

除此之外,不要循环find的输出(参见"为什么循环查找的输出错误的做法?")。

在您的例子中,循环

代码语言:javascript
复制
logs=$(find /var/lib/docker/ -type f -name *.log -size +25M)  
for log in $logs  
  do  
    echo "clean logs : $log"  
    cat /dev/null > $log  
  done  

可以重写为

代码语言:javascript
复制
find /var/lib/docker -type f -name '*.log' -size +25M -exec sh -c '
for log
  do
    echo "clean logs : $log"  
    cat /dev/null > "$log"
  done' sh {} +

或者,如果您有GNU truncate实用程序,

代码语言:javascript
复制
find /var/lib/docker -type f -name '*.log' -size +25M \
    -exec echo "clean logs: " {} \; -exec truncate --size=0 {} +

或者,用GNU find

代码语言:javascript
复制
find /var/lib/docker -type f -name '*.log' -size +25M \
    -printf 'clean logs: %p\n' -exec truncate --size=0 {} +

第二个循环可以用相同的方式重写,也可以将它们组合在一起:

代码语言:javascript
复制
find /var/lib/docker -type f -name '*.log' \
    \( \( -size +25M -printf 'clean logs: %p\n'  \) -o \
       \( -mtime +7  -printf 'delete logs: %p\n' \) \) -exec truncate --size=0 {} +

也见"理解-exec选项find“。

由于您的脚本只使用标准sh语法,因此可以另外将第一行更改为#!/bin/sh

票数 3
EN

Unix & Linux用户

发布于 2020-04-19 08:40:01

例如,需要更改使用find的两行

查找/var/lib/docker/ -type f -name *.log -size +25M

问题在于未引用的*.log。把它放在单引号里,'*.log'

原因是,当没有引用时,shell可以访问它并展开它以匹配当前目录中的文件。如果您有两个或多个日志文件,您将得到类似的内容,这将触发您正在看到的find错误

代码语言:javascript
复制
find /var/lib/docker/ -type f -name aa.log bb.log cc.log -size +25M
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/581064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档