【问题标题】:About: extracting *.gz files and move a original file to other folder关于:提取 *.gz 文件并将原始文件移动到其他文件夹
【发布时间】:2016-02-15 16:18:41
【问题描述】:

我对 shell 脚本几乎是新手,但不知道一些命令。 我正在尝试在 shell 脚本下面写,请给一些指导。 1. 从特定目录读取 *.gz 文件 2.解压到其他文件夹 3. 将原始文件移动到另一个文件夹。 我可以做三个单独的 shell 脚本,但我希望它包含一个 shell 脚本。然后这个脚本将是 cronjob 并且每 5 分钟运行一次。 我试图从下面开始,但不知何故我有点困惑如何获取文件列表。我可以在这里做另一个脚本,但想包含在一个脚本中。”


#!/bin/bash

while IFS= read file; do
    gzip -c "$file" > "zipdir/$(basename "$file").gz"
done < filelist
-----------------------------------------

PS:文件每 5 分钟创建一次。

【问题讨论】:

    标签: shell centos gunzip


    【解决方案1】:

    有几种方法可以实现您正在寻找的东西(我会考虑notify)。无论如何...这是一个非常简单的实现:

    $ source=~/tmp/source   # directory where .gz files will be created
    $ target=~/tmp/target   # target directory for uncompressed files
    $ archive=~/tmp/archive # archive dir for .gz files
    $ shopt -s nullglob     # avoid retiring unexpanded paths
    $ for gz in ${source}/*.gz ; do gzip -dc "$gz" > ${target}/$(basename "$gz" .gz) ; mv "$gz" ${archive}/ ; done
    $ shopt -u nullglob     # reset nullglob
    

    如果您确定“源”目录将始终包含 .gz 文件,则可以避免使用 shopt。

    另一个解决方案(不需要 shopt)是这样的:

    find ${source} -name '*.gz' -print0 | while read -d '' -r gz; do
        gzip -dc "$gz" > ${target}/$(basename "$gz" .gz)
        mv "$gz" ${archive}/
    done
    

    第一行看起来有点复杂,因为它管理包含空格的源文件名...

    【讨论】:

    • 非常感谢,是不是 gzip ,应该是 gunzip 才可以解压?只是不明白 shopt -s nullglob 和 shopt -u nullglob。 (避免淘汰未扩展的路径)
    • 假设您的“源”目录(包含原始 .gz 文件的目录为空)。在这种情况下,for 循环将返回未公开的 $source/*.gz (带有星号)并且 - 当然 - gzip 和 mv 都会抱怨它。通过shoot -s nullglob 设置“nullglob”标志,我们可以防止返回未扩展(不存在)的路径。最后的另一个命令shoot -u null glob 将此标志重置为默认值。
    • re-gunzip:我的命令是正确的,因为我确实使用了-d(解压缩)选项(“gunzip”=“gzip -d”)。
    • 好的,如果我确定没有空文件,那么我可以不使用 shopt 命令吗?
    猜你喜欢
    • 1970-01-01
    • 2021-05-15
    • 2022-01-09
    • 1970-01-01
    • 2015-03-02
    • 2021-08-19
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多