繁体   English   中英

满足特定名称条件的tar和zip文件的最佳方法?

[英]Best way to tar and zip files meeting specific name criteria?

我正在Linux计算机上编写一个Shell脚本,以通过crontab运行该脚本,该脚本旨在将当前日期之前的所有文件移动到新文件夹,然后对整个文件夹进行tar和zip压缩。 似乎是一个简单的任务,但是由于某种原因,我遇到了各种各样的障碍。 我是新手,自学成才,因此非常感谢您的帮助或重定向。

归档文件的特定标准:

  • 所有日志文件位于/home/tech/logs/ ,所有pdf文件位于/home/tech/logs/pdf

  • 如文件名所示,所有文件都已存在一天以上(文件名不包含$CURRENT_DATE

  • 所有文件都必须为*.log*.pdf (即,如果不是日志文件或pdf文件,则不要存档不包含$CURRENT_DATE文件。

文件名格式说明:

所有日志文件名称均以NAME 00_20180510.log格式位于home/tech/logs中,所有pdf文件都位于NAME 00_20180510_00000000.pdf (“格式”的子目录( home/tech/logs/pdf )中。创建文件时将使用“ 20180510”,0表示任意数字)。 我需要使用名称而不是文件元数据来创建日期,并且其名称不包括当前日期的所有文件(pdf /日志)均为“旧”。 我也不能只移动名称中不包含$CURRENT_DATE所有文件,因为它将带有任何非*.pdf*.log文件。

现在,脚本为旧文件创建了一个新文件夹,其中包含新的pdf子目录( mkdir -p /home/tech/logs/$ARCHIVE_NAME/pdf )。 然后,我想将旧日志移至$ARCHIVE_NAME ,并将所有旧pdf从原始pdf子目录移至$ARCHIVE_NAME/pdf

当前代码:

find /home/tech/logs -maxdepth 1 -name ( "*[^$CURRENT_DATE].log" "*.log" ) -exec mv -t "$ARCHIVE_NAME" '{}' ';'

find /home/tech/logs/pdf -maxdepth 1 -name ( "*[^$CURRENT_DATE]*.pdf" "*.pdf" ) -exec mv -t "$ARCHIVE_NAME/pdf" '{}' ';'

这没有用,因为它将$CURRENT_DATE中的数字视为要排除的数字列表而不是文字字符串。

我考虑过只使用tar的排除选项,如下所示:

tar -cvzPf "$ARCHIVE_NAME.tgz" --directory /home/tech/logs --exclude="$CURRENT_DATE" --no-unquote --recursion --remove-files --files-from="/home/tech/logs/"

但是a)不起作用,b)理论上它将包括不是*.pdf*.log文件的所有文件,这将是一个问题。

我使这个复杂化了吗? 有没有更好的方法来解决这个问题?

我将使用bash的扩展glob功能来解决此问题,该功能使您可以否定模式:

#!/bin/bash

shopt -s extglob

mv /home/tech/logs/*!("$CURRENT_DATE")*.log "$ARCHIVE_NAME"
mv /home/tech/logs/pdf/*!("$CURRENT_DATE")*.pdf "$ARCHIVE_NAME"/pdf

启用extglob!(pattern)会扩展到与模式(或管道分隔的模式列表)不匹配的所有内容。

使用find也应该可行:

find /home/tech/logs -name '*.log' -not -name "*$CURRENT_DATE*" -exec mv -t "$ARCHIVE_NAME" {} +

在@ tom-fenech答案的基础上进行了优化,可以避免许多mv调用:

find /home/tech/logs -maxdepth 1 -name '*.log' -not -name "*_${CURRENT_DATE?}.log" | \
  xargs mv -t "${ARCHIVE_NAME?}"

通过处理管道的文件,一个有趣的功能是能够使用额外的工具(也称为grep :)对其进行过滤,这可以(可以说)变得更具可读性,即->

find /home/tech/logs -maxdepth 1 -name '*.log' | fgrep -v "_${CURRENT_DATE?}" | \
  xargs mv -t "${ARCHIVE_NAME?}"

然后,对于pdf ,类似地, 顺便说一句,您可以通过将echo mv替换为mv“空运行”

--jjo

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM