【问题标题】:How do I know the total number of files after splitting in Linux Split在 Linux Split 中如何知道拆分后的文件总数
【发布时间】:2025-12-13 14:05:01
【问题描述】:

我知道Linux Split可以通过以下方式按文件大小拆分大文件,结果是numeric suffix的形式

split -b 1G -d filepath suffix"

# result
suffix01  suffix02 ...

但我希望能够在其中获得总拆分结果并将其用于拆分文件,例如five files,我希望结果如下

suffix5-01  suffix5-02 suffix5-03 suffix5-04 suffix5-05

虽然您可以使用 du 等其他方法来获取总文件大小,但我不知道拆分是否基于 du 获取的大小,这不是一种优雅的方式。

因此,是否有完美的解决方案来达到预期的效果?

【问题讨论】:

    标签: linux split du


    【解决方案1】:

    您可以使用 GNU Parallel 做到这一点。

    首先制作一个 10MB 的文件以供使用:

    dd if=/dev/zero bs=10240 count=1024 > data.bin
    

    现在拆分为 1MB 的块,将每个块命名为 suffix{TOTALCHUNKS}-{CHUNKNUMBER}

    parallel --recend '' --plus --pipepart --block 1M cat \> suffix{##}-{#} :::: data.bin
    

    结果

    -rw-r--r--     1 mark  staff   1048576  9 Aug 16:57 suffix10-1
    -rw-r--r--     1 mark  staff   1048576  9 Aug 16:57 suffix10-2
    -rw-r--r--     1 mark  staff   1048576  9 Aug 16:57 suffix10-3
    -rw-r--r--     1 mark  staff   1048576  9 Aug 16:57 suffix10-4
    -rw-r--r--     1 mark  staff   1048576  9 Aug 16:57 suffix10-5
    -rw-r--r--     1 mark  staff   1048576  9 Aug 16:57 suffix10-6
    -rw-r--r--     1 mark  staff   1048576  9 Aug 16:57 suffix10-7
    -rw-r--r--     1 mark  staff   1048576  9 Aug 16:57 suffix10-8
    -rw-r--r--     1 mark  staff   1048576  9 Aug 16:57 suffix10-9
    -rw-r--r--     1 mark  staff   1048576  9 Aug 16:57 suffix10-10
    

    注意事项:

    • 您需要--recend '' 来阻止 GNU Parallel 尝试在换行符上拆分您的文件

    • 您需要--plus,以便将{##} 设置为作业总数

    • 您需要--pipepart 以使其在可搜索文件上更快 - 如果您的文件不可搜索,请改用--pipe

    • {##} 表示块的总数

    • {#} 表示当前块号

    【讨论】:

      【解决方案2】:

      为了得到你指定格式的分割文件,你可以使用这个:

      split -b 1G -d filepath suffix-
      

      然后,获取拆分文件的数量:

      ls | grep suffix- | wc -l
      

      如果要获取每个拆分文件的大小:

      for i in $(find . -name 'suffix-*'); do
        echo "$i has size: $(stat --format '%s' $i)B"
      done
      

      这将为您提供以字节表示的每个文件的大小。以 KB 打印结果:

      for i in $(find . -name 'suffix-*'); do
        echo "$i has size: $(expr $(stat --format '%s' $i) / 1024)KB"
      done
      

      此外,如果您希望对输出进行排序并从结果中删除字符“./”,您可以使用:

      for i in $(find . -name 'suffix-*'); do
        echo "$i has size: $(expr $(stat --format '%s' $i) / 1024)KB"
      done | sort | cut -c3-
      

      【讨论】:

        最近更新 更多