【问题标题】:Testing whether any files are older than 7 days测试是否有任何文件超过 7 天
【发布时间】:2018-10-20 22:13:53
【问题描述】:

我有一个脚本,可以在文件夹中查找文件,如果它们超过 7 天,则将其删除。不过,我有一个小问题。

#!/bin/bash
BACKUPDIR=/home/vagrant/script/aerospike_backups
TIMESTAMP=$(date +%Y-%m-%d)
LOGPATH=/tmp/logs.txt
ADMINACC=email@example.com
EMEIL=rybka@gl.com
#Let's check existing backups, and if it's older than 7 days delete
find_old () {
     if [ -z $(find $BACKUPDIR -mtime +7 -print ) ]
       then
            return 10
              else
find $BACKUPDIR -mtime +7 -delete && echo "Backups deleted at $HOSTNAME on $TIMESTAMP" >  $LOGPATH

fi
} 

如果我从终端使用 ./scriptname 使用空 $BACKUPDIR 执行此脚本,则键入 echo $? shell 按预期输出 10 个代码,因为没有 7 天以前的文件或根本没有文件。

但在我添加更多 if 条件后

if [[ $(find_old | echo $?) -gt 0 ]]
then
echo "Script return error code"
else
echo "all is ok"

脚本给了我输出all is ok,但它真的不应该吗?怎么了?

【问题讨论】:

标签: bash find


【解决方案1】:

最好将找到的文件存储在一个数组中然后删除它们,而不是调用两次find - 这样,我们可以保证删除我们找到的确切文件集,除了更多高效。

find_old() {
    while read -r -d '' file; do                  # read the output of find one file at a time
      files+=("$file")                            # append to the array
    done < <(find "$BACKUPDIR" -mtime +7 -print0) # generate NUL separated list of files
    if ((${#files[@]} == 0)); then
      # no files found
      return 10
    else
      printf '%s\0' "${files[@]}" | xargs -0 rm -f --
    fi
}

然后,调用你的函数:

find_old; exit_code=$?
if ((exit_code > 0)) {
  echo "Script returned error code $exit_code"
else
  echo "All is OK"
fi

我已经修复了您代码中的一些问题:

  • 在扩展变量时引用变量很重要。例如:find "$BACKUPDIR" 而不是 find $BACKUPDIR
  • if [[ $(find_old | echo $?) -gt 0 ]] 不是检查函数退出码的方式;你需要直接检查$?

另见:

【讨论】:

  • 这里唯一需要注意的是,如果您的文件列表长于一个命令行,则可能会失败。可能printf '%s\0' "${files[@]}" | xargs -0 rm -f --
  • 另外,我们现在忽略来自rm 的任何错误退出状态。最好省略return 0,让rm 的成功或失败通过。
  • 更新了答案。谢谢查尔斯!
猜你喜欢
  • 2016-09-20
  • 2015-07-24
  • 1970-01-01
  • 2018-11-22
  • 2019-04-04
  • 2021-12-11
  • 1970-01-01
  • 2012-05-07
  • 2018-11-01
相关资源
最近更新 更多