这段代码如何压缩文件?

Tha*_* Vu 2 command-line bash

我读过这行代码:

compress_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")
Run Code Online (Sandbox Code Playgroud)

谁能帮助我理解这个命令以及如何以其他方式编写这段代码?

raj*_*raj 12

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

  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


pLu*_*umo 7

  1. bzip2 "$file"
    
    Run Code Online (Sandbox Code Playgroud)

    这将bzip2在变量“$file”中保存的文件名上运行。bzip2会将文件压缩到一个名为$file.bz2.

  2. stat -c %s "$file.bz2"
    
    Run Code Online (Sandbox Code Playgroud)

    stat这在新创建的 compress 上运行$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
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. stat - display file or file system status
    
        -c  --format=FORMAT
             use the specified FORMAT instead of the default
        %s    total size, in bytes
    
    Run Code Online (Sandbox Code Playgroud)

    这称为命令替换

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

    因此,var=$(some_command)将some_command 的输出保存到变量中var


总共:

$(some_command)
Run Code Online (Sandbox Code Playgroud)

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


然而,还有改进的空间:

您应该将子 shell 中的命令与 结合起来&&,以便仅在成功stat时运行。bzip2

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

compress_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")
Run Code Online (Sandbox Code Playgroud)