在 bash 中使用 bzip gzip zip

在 bash 中使用 bzip gzip zip
#!/bin/bash

# check if the user put a file name
if [ $# -gt 0 ]; then

    # check if the file is exist in the current directory
    if [ -f "$1" ]; then

        # check if the file is readable in the current directory
        if [ -r "$1" ]; then
            echo "File:$1"
            echo "$(wc -c <"$1")"

            # Note the following two lines
            comp=$(bzip2 -k $1)
            echo "$(wc -c <"$comp")"
        else
            echo "$1 is unreadable"
            exit
        fi
    else
        echo "$1 is not exist"
        exit
    fi
fi

目前我的问题是我可以通过bzip将$1文件压缩成一个$1.c.bz2文件,但是如果我来捕获压缩文件的大小怎么办?我的代码显示没有此类文件。

答案1

我为你清理了代码:

#!/bin/bash

#check if the user put a file name
if [ $# -gt 0 ]; then
    #check if the file is exist in the current directory
    if [ -f "$1" ]; then
        #check if the file is readable in the current directory
        if [ -r "$1" ]; then
            echo "File:$1"
            echo "$(wc -c <"$1")"
            comp=$(bzip2 -k $1)
            echo "$(wc -c <"$comp")"
        else
            echo "$1 is unreadable"
            exit
        fi
    else
        echo "$1 is not exist"
        exit
    fi
fi

fi请注意倒数第二行中的附加内容。

现在,第 11 行没有多大意义,因为bzip2 -k test.file没有创建任何输出。因此该变量comp只是空的。

一个简单的方法是简单地知道扩展名是.bz2,所以你可以这样做:

            echo "$(wc -c <"${1}.bz2")"

comp并且根本不使用该变量。

答案2

bzip2 -k不输出任何内容,因此在命令替换中运行它并捕获变量中的输出comp将使该变量为空。这个空变量是您的主要问题。使用它也statwc -c随意获取文件的大小更好,因为更有效,stat只是从文件的元数据中读取文件大小,而不必费心从文件中读取所有数据。

您还对文件存在性和可读性进行了许多不必要的检查,这些检查分散了脚本的注意力。这些检查bzip2无论如何都会执行,您可以利用这一事实来避免自己测试其中的大部分内容。

建议:

#!/bin/sh

pathname=$1

if ! bzip2 -k "$pathname"; then
    printf 'There were issues compressing "%s"\n' "$pathname"
    echo 'See errors from bzip2 above'
    exit 1
fi >&2

size=$( stat -c %s "$pathname" )
csize=$( stat -c %s "$pathname.bz2" )

printf '"%s"\t%s --> %s\n' "$pathname" "$size" "$csize"

该脚本使用 的退出状态bzip2来确定压缩文件是否顺利。如果失败,它会输出一条诊断消息,以补充bzip2终端中已生成的诊断消息。

由于您使用-kwithbzip2来保留未压缩的文件,因此可以在语句之后获得两个文件的大小if。如果要从-k命令中删除,您自然必须在if语句之前获取未压缩文件的大小。

脚本中使用的方式stat假设该脚本运行在Linux系统上。该stat实用程序是非标准的,并与其他系统上的其他选项一起实现。例如,在 macOS 或 OpenBSD 上,您必须使用stat -f %z来代替stat -c %s.

测试:

$ ./script
bzip2: Can't open input file : No such file or directory.
There were issues compressing ""
See errors from bzip2 above
$ ./script nonexisting
bzip2: Can't open input file nonexisting: No such file or directory.
There were issues compressing "nonexisting"
See errors from bzip2 above
$ ./script file
"file"  600 --> 43
$ ./script file
bzip2: Output file file.bz2 already exists.
There were issues compressing "file"
See errors from bzip2 above
$ rm -f file.bz2
$ chmod u-r file
$ ./script file
bzip2: Can't open input file file: Permission denied.
There were issues compressing "file"
See errors from bzip2 above

相关内容