备份脚本抛出错误

备份脚本抛出错误

我有以下脚本:

#!/bin/sh

#Finds all folders and subsequent files that were modified yesterday and dumps them out to a text

updatedb && rm /tmp/*

echo $(locate -b `date --date='yesterday' '+%Y.%m.%d'`) > /tmp/files.txt

#creates variable out of the file. 

input="/tmp/files.txt"

yest=$(date --date='yesterday' '+%Y.%m.%d')

#loops through each entry of folders

while IFS= read -r folders

do

echo $folders

tar -cvf $folders\.tar $folders --remove-files

done < "$input"

它给了我错误:

tar: /backup/DNS/intns1/2016.07.19: Cannot open: Is a directory

tar: Error is not recoverable: exiting now

试图弄清楚我做错了什么......

答案1

date使用、findtar和的最新 GNU 版本xargs

该脚本需要 bash 或 ksh 或 zsh 或其他一些能够理解的相当现代的 shell流程替代( <(...))

#!/bin/bash

    today='12am today'
yesterday='12am yesterday'

# function to create a tar file for a directory but only include
# files older than "$2" but newer than "$3".  Delete any files
# added to the tar archive.
#
# the tar file will be created uncompressed in the same directory
# as the directory itself.  e.g. ./dir --> ./dir.tar
function tarit() {
  dir="$1"
  older="$2"
  newer="$3"

  tar cvf "$dir.tar" -C "$dir/.." --null --remove-files \
    -T <(find "$dir" ! -newermt "$older" -newermt "$newer" -type f -print0)
}

# we need to export the function so we can
# run it in a bash subshell from xargs
export -f tarit

# we want to find newer files but output only the path(s)
# containing them with NULs as path separator rather than
# newlines, so use `-printf '%h\0'`.
find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h\0' |
  sort -u -z |    # unique sort the directory list
  xargs -0r -I {} bash -c "tarit \"{}\" \"$today\" \"$yesterday\""

注意如何引用所有变量以确保安全(即使在 bash 子 shell 中,也使用转义引号),以及使用 NUL 作为分隔符(这样,如果路径名和/或文件名包含烦人但完全有效的文件名,则脚本不会中断)空格或换行符等字符)。另请注意使用缩进和额外空格来提高可读性。并通过评论来解释正在做什么以及为什么。

如果您只想压缩整个目录并删除目录本身(以及其中的所有文件),则更简单:

#!/bin/bash

    today='12am today'
yesterday='12am yesterday'    

find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h\0' |
  sort -u -z |
  xargs -0r -I {} tar cfv "{}.tar" "{}" -C "{}/.." --remove-files

就我个人而言,我认为使用这些脚本都是极其危险的。如果您不小心(例如,以 root 身份运行它们,/而不是.作为查找路径...或者只是在/目录中运行它们),您可以删除操作系统所需的文件甚至整个目录。即使在您的主目录(或您有写入权限的任何地方 - 无论如何您都需要创建 tar 文件)中的 uid 下运行它们,也可能会删除您想要保留的文件。

我认为你真的需要重新考虑您是否真的需要使用--remove-files的选项tar。你想达到什么目的?这是某种 tmpreaper 吗?如果是这样,那么盲目地删除其中的文件/tmp可能会破坏长时间运行的进程,例如昨天在 /tmp 中创建的文件,今天或明天需要重新使用它们。

简而言之:这是一对上膛的霰弹枪。尽量不要用他们搬起石头砸自己的脚。

相关内容