用于归档文件然后复制新文件的 Bash 脚本

Posted

技术标签:

【中文标题】用于归档文件然后复制新文件的 Bash 脚本【英文标题】:Bash script to archive files and then copy new ones 【发布时间】:2009-09-02 14:51:55 【问题描述】:

需要一些帮助,因为我的 shell 脚本技能略低于 l337 :(

我需要 gzip 几个文件,然后从另一个位置将较新的文件复制到顶部。我需要能够从其他脚本中以下列方式调用此脚本。

exec script.sh $oldfile $newfile

谁能指出我正确的方向?

编辑:添加更多细节:

此脚本将用于每月更新一些上传到文件夹的文件,旧文件需要归档到一个压缩文件中,新文件可能有不同的名称,复制在旧文件的顶部。需要从另一个脚本逐个文档案例调用该脚本。这个脚本的基本流程应该是 -

    脚本文件应该创建一个新的 gzip 具有指定名称的存档(从脚本中的前缀常量和当前月份和年份创建,例如 prefix.september.2009.tar.gz)仅当它 不存在,否则添加到现有的。 将旧文件复制到存档中。 用新文件替换旧文件。

提前致谢, 理查德

编辑:在存档文件名上添加了模式细节

【问题讨论】:

好的,但是由于您想将多个文件存储为单个压缩文件,因此您现在还需要将存档文件名指定为一个额外的参数,因为它不能再从 oldfile (您可以将 oldfile 添加到任何现有档案中,或者您可能想要创建一个新档案)。您能否说明您希望它如何在您的工作流程中发挥作用? 问题更新:文件名应该由脚本中的前缀常量和当前月份和年份创建,例如文件前缀.month.year.tar.gz 我知道我可以使用类似于 PREFIX="fileprefix";FILENAME=$(date +"$PREFIX.%B.%Y.gz) 的内容来格式化文件名,但我该如何检查如果存在,如果存在,如何添加更多文件? @Frozenskys:我已经更新了我的答案。希望这会给你足够的骨架来适应你的需求。 【参考方案1】:

这是根据您的说明修改后的脚本。我使用tar 存档,用gzip 压缩,将多个文件存储在一个存档中(您不能单独使用gzip 存储多个文件)。这段代码只是表面上的测试——它可能有一个或两个错误,如果你在愤怒中使用它,你应该添加更多的代码来检查命令是否成功等。但它应该能让你大部分时间到达那里。

#!/bin/bash

oldfile=$1
newfile=$2

month=`date +%B`
year=`date +%Y`

prefix="frozenskys"

archivefile=$prefix.$month.$year.tar

# Check for existence of a compressed archive matching the naming convention
if [ -e $archivefile.gz ]
then
    echo "Archive file $archivefile already exists..."
    echo "Adding file '$oldfile' to existing tar archive..."
    
    # Uncompress the archive, because you can't add a file to a
    # compressed archive
    gunzip $archivefile.gz

    # Add the file to the archive
    tar --append --file=$archivefile $oldfile
    
    # Recompress the archive
    gzip $archivefile

# No existing archive - create a new one and add the file
else
    echo "Creating new archive file '$archivefile'..."
    tar --create --file=$archivefile $oldfile
    gzip $archivefile
fi

# Update the files outside the archive
mv $newfile $oldfile

将其保存为script.sh,然后使其可执行:

chmod +x script.sh

然后像这样运行:

./script.sh oldfile newfile

frozenskys.September.2009.tar.gz 之类的东西将被创建,newfile 将替换 oldfile。如果需要,您还可以从另一个脚本中使用 exec 调用此脚本。只需将此行放在您的第二个脚本中:

exec ./script.sh $1 $2

【讨论】:

差不多了 :) - 但我需要能够继续向存档添加更多文件。我更新了问题,以便更好地解释我正在尝试做的事情的流程。 你是我的英雄,太完美了!【参考方案2】:

任何 bash 脚本的一个很好的参考是Advanced Bash-Scripting Guide。

本指南解释了 bash 脚本的所有内容。

我会采取的基本方法是:

Move the files you want to zip to a directory your create.
   (commands mv and mkdir)

zip the directory. (command gzip, I assume)

Copy the new files to the desired location (command cp)

根据我的经验,bash 脚本主要是知道如何很好地使用这些命令,如果你可以在命令行上运行它,你就可以在你的脚本中运行它。

另一个可能有用的命令是

pwd - this returns the current directory

【讨论】:

不要忘记错误条件。 cp、mv、gzip 等都可能失败。您编写的任何脚本都应该尽可能健壮(养成的好习惯)。在尝试操作之前检查 $oldfile 和 $newfile 是否存在。检查您编写的每个命令是否成功。 Perl 有一个很好的方法来做到这一点:"some_command || die "some_command failed",但我们也可以在 bash 中做到这一点。 好点 - 但是我需要弄清楚如何让脚本工作,然后才能添加错误处理:)【参考方案3】:

为什么不使用版本控制?这要容易得多;只需检查并压缩。

(如果不行请见谅)

【讨论】:

好主意,这就是我用于代码更新的方法 - 使用出色的 beanstalkapp 服务,但这不是这些文档的选项。

以上是关于用于归档文件然后复制新文件的 Bash 脚本的主要内容,如果未能解决你的问题,请参考以下文章

用于搜索目录并将文件移动到新目录、删除任何副本的 Bash 脚本

用于监视新文件目录的 bash 脚本

使用 7zip 归档子文件夹而不归档档案的 Bash 脚本

仅提取特定文件名然后将其用于变量的 Bash 脚本

Bash 脚本 - 如何设置创建新文件的组?

清理和归档桌面脚本(Windows)