用于归档文件然后复制新文件的 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 脚本的主要内容,如果未能解决你的问题,请参考以下文章