此代码如何压缩文件?

此代码如何压缩文件?

我读过这行代码:

compress_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")

有人能帮助我理解这个命令以及如何以其他方式编写此代码吗?

答案1

让我们分解一下这个命令。

  1. compress_size_bzip2=anythingcompress_size_bzip2将所调用的 shell 变量(仅仅是一个名称,没有特殊含义)的值设置为anything符号右边的值=

  2. anything在我们的例子中是。$(command)这是一个命令替换;此构造的值等于command输出中写出的任何值。

  3. commandbzip2 "$file" ; stat -c %s "$file.bz2",因此实际上是两个命令相继执行。第一个命令bzip2 "$file"压缩文件名取自 shell 变量file。如果文件名包含空格,则使用引号。通常此命令不会写入任何内容。第二个命令stat -c %s "$file.bz2"输出文件名的大小,文件名为 shell 变量的值file加上扩展名.bz2

因此,该大小是整体的输出command,并且它被分配给变量compress_size_bzip2

例如,如果你将变量设置file为要压缩的文件名,file=myfile.txt然后运行上面的行,则会发生两件事:

  1. 文件myfile.txt将被压缩为myfile.txt.bz2
  2. 文件的大小myfile.txt.bz2将被赋给变量compress_size_bzip2。您可以使用命令显示该值echo $compress_size_bzip2

答案2

  1. bzip2 "$file"
    

    这将对bzip2保存在变量“$file”中的文件名运行。bzip2将文件压缩为名为 的新文件$file.bz2

  2. stat -c %s "$file.bz2"
    

    stat在新创建的压缩上运行$file.bz2

    man stat

    stat - display file or file system status
    
        -c  --format=FORMAT
             use the specified FORMAT instead of the default
        %s    total size, in bytes
    

    因此,该stat命令将返回新文件的文件大小(以字节为单位)。

  3. $(some_command)
    

    这就是所谓的命令替换

    Bash 通过在子 shell 环境中执行命令并用命令的标准输出替换命令替换来执行扩展。

    因此,var=$(some_command)节省了输出将 some_command 放入变量中var


总共:

compress_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")

这将在子 shell 中运行bzip2stat。子 shell 的输出是压缩文件的大小(以字节为单位),它将保存在变量 中$compress_size_bzip2


然而,仍有改进的空间:

您应该将子 shell 中的命令与 结合起来&&,这样stat只有在bzip2成功时才会运行。

如果您不需要压缩文件,您应该使用标志bzip2来告诉压缩到标准输出-c,并使用wc -c来告诉它的大小:

compress_size_bzip2=$(bzip2 -c "$file" | wc -c)

相关内容