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

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

归档文件的特定标准:

  • 所有日志文件都在/home/tech/logs/,所有pdf文件都在/home/tech/logs/pdf

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

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

文件名格式说明:

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

现在,脚本会为旧文件(mkdir -p /home/tech/logs/$ARCHIVE_NAME/pdf)创建一个带有新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文件,这将是一个问题。


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


慕妹3146593
浏览 292回答 2
2回答

手掌心

我将使用bash的扩展glob功能来解决此问题,该功能使您可以否定模式:#!/bin/bashshopt -s extglobmv /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" {} +

慕村9548890

在@ 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,顺便说一句,您可以通过替换为来“空运行”上面mv的内容echo mv。--jjo
打开App,查看更多内容
随时随地看视频慕课网APP