gpt4 book ai didi

linux - 满足特定名称标准的 tar 和 zip 文件的最佳方式?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:13:44 24 4
gpt4 key购买 nike

我正在 Linux 机器上编写一个 shell 脚本,通过 crontab 运行,这意味着将所有早于当天的文件移动到一个新文件夹,然后 tar 并压缩整个文件夹。似乎是一项简单的任务,但出于某种原因,我遇到了各种障碍。我是这方面的新手并且是自学成才的,因此非常感谢任何帮助或重定向。

归档文件的具体标准:

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

  • 如文件名所示,所有文件都超过一天(文件名不包括 $CURRENT_DATE )

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

文件名格式规范:

所有日志文件名都在home/tech/logs中格式为 NAME 00_20180510.log ,并且所有 pdf 文件都位于格式为 home/tech/logs/pdf 的“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文件,这将是一个问题。

我是不是太复杂了?有没有更好的方法来解决这个问题?

最佳答案

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

关于linux - 满足特定名称标准的 tar 和 zip 文件的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50279427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com