0

我目前在我的 Bash 脚本中遇到问题,并且每次尝试修复它时似乎都在黑暗中运行得更深。

背景:我们有一个文件夹,里面装满了编号的崩溃文件夹,里面装满了崩溃文件。有人每天都在导出这些文件夹的列表。在该导出期间,编号的崩溃文件夹获得属性“user.exported=1”。

其中一些不会被导出,因此它们不会具有该属性,并且只有在它们超过 30 天时才应将其删除。

我的问题:我正在设置一个 bash 脚本,该脚本最终通过 Cron 运行以定期检查文件夹,这些文件夹具有属性“user.exported=1”并且超过 14 天,并通过删除它们rm -rfv FOLDER >> deleted.log

然而,我们也有一些文件夹没有或没有属性“user.exported=1”,然后需要在它们超过 30 天后将其删除。我创建了一个 IF ELIF FI 比较来检查它,但这就是我卡住的地方。

我的代码:

#!/bin/bash

# Variable definition
LOGFILE="/home/crash/deleted.log"
DATE=`date '+%d/%m/%Y'`
TIME=`date '+%T'`
FIND=`find /home/crash -maxdepth 1 -mindepth 1 -type d`

# Code execution
printf "\n$DATE-$TIME\n" >> "$LOGFILE"

for d in $FIND; do
  # Check if crash folders are older than 14 days and have been exported
  if [[ "$(( $(date +"%s") - $(stat -c "%Y" $d) ))" -gt "1209600" ]] && [[ "$(getfattr -d --absolute-names -n user.exported --only-values $d)" == "1" ]]; then
    #echo "$d is older than 14 days and exported"
    "rm -rfv $d" >> "$LOGFILE"
  # Check if crash folders are older than 30 days and delete regardless
  elif [[ "$(( $(date +"%s") - $(stat -c "%Y" $d) ))" -gt "1814400" ]] && [[ "$(getfattr -d --absolute-names -n user.exported $d)" == FALSE ]]; then
    #echo "$d is older than 30 days"
    "rm -rfv $d" >> "$LOGFILE"
  fi
done

IF 部分工作正常,它删除了属性为“user.exported=1”的文件夹,但 ELIF 部分似乎不起作用,因为我只在 bash 中得到输出,例如:

/home/crash/1234: user.exported: No such attribut
./crash_remove.sh: Line 20: rm -rfv /home/crash/1234: File or Directory not found

当我在脚本运行后查看崩溃文件夹时,该文件夹及其内容仍然存在。

我的脚本中肯定有错误,但看不到它。请问有人可以帮我解决这个问题吗?

提前致谢

4

1 回答 1

4

只引用扩展,而不是整个命令。

代替:

"rm -rfv $d"

做:

rm -rfv "$d"

如果你引用它,bash 会尝试运行一个名为 literal 的命令rm<space>-rfv<space><expansion of d>

不要使用反引号`。改为使用$(...)Bash 黑客 wiki 过时的不推荐使用的语法

不要for i in $(cat)var=$(...); for i in $var。使用while IFS= read -r循环。如何在 bash 中逐行读取文件

而不是if [[ "$(( $(date +"%s") - $(stat -c "%Y" $d) ))" -gt "1814400" ]]只在算术扩展中进行比较,例如:if (( ( $(date +"%s") - $(stat -c "%Y" $d) ) > 1814400 )).

我认为您可以在 中完成所有操作find,例如::

find /home/crash -maxdepth 1 -mindepth 1 -type d '(' \
    -mtime 14 \
    -exec sh -c '[ "$(getfattr -d --absolute-names -n user.exported --only-values "$1")" = "1" ]' -- {} \; \
    -exec echo rm -vrf {} + \
')' -o '(' \
    -mtime 30 \
    -exec sh -c '[ "$(getfattr -d --absolute-names -n user.exported "$1")" = FALSE ]' -- {} \; \
    -exec echo rm -vrf {} + \
')' >> "$LOGFILE"
于 2020-03-17T14:31:44.197 回答