我有以下脚本:
#!/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
使用、find
、tar
和的最新 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 中创建的文件,今天或明天需要重新使用它们。
简而言之:这是一对上膛的霰弹枪。尽量不要用他们搬起石头砸自己的脚。