为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕妹3146593 2021-04-12 14:26:40
我正在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文件,这将是一个问题。我使这个复杂化了吗?有更好的方法来解决这个问题吗?
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

我将使用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" {} +



查看完整回答
反对 回复 2021-04-16
?
慕村9548890

TA贡献1884条经验 获得超4个赞

在@ 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


查看完整回答
反对 回复 2021-04-16
  • 2 回答
  • 0 关注
  • 257 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信