【问题标题】:List filenames up to a limit per each text file in Bash在 Bash 中列出每个文本文件的最大文件名限制
【发布时间】:2014-01-24 03:51:17
【问题描述】:

如何创建多个文本文件,其中包括特定目录中文件的文件名,每个文本文件最多 999 行?

我是从这里开始的:

find ./J0902-405/*.evt -maxdepth 1 -type f -fprintf files_xselect.list %f\\n

它会在文本文件中正确写入文件名。 但后记,我需要设置 999 行的限制,在这个限制之后,创建另一个具有以下 999 个名称的文本文件,依此类推,直到列出所有 *.evt 文件。

【问题讨论】:

    标签: linux bash shell command-line


    【解决方案1】:

    find ./J0902-405/*.evt -maxdepth 1 -type f | split -l999 -

    来自手册页:

    NAME
       split - split a file into pieces
    
    SYNOPSIS
       split [OPTION]... [INPUT [PREFIX]]
    
    DESCRIPTION
       Output  fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default size is 1000 
       lines, and default PREFIX is `x'.  With no INPUT, or when INPUT is -, read standard 
       input.
    
       -l, --lines=NUMBER
              put NUMBER lines per output file
    

    【讨论】:

    • +1 没听说过split,每天都在学习知道的东西。
    • 在 POSIX 中,这是一个不言而喻的真理,大多数时候,已经有工具可以完成这项工作,$JOB 的值足够简单。 (:
    【解决方案2】:

    @DopeGhoti 的答案是正确的方法,但让我稍微充实一下,对于那些刚接触split 的人(比如我):

    find ./J0902-405 -maxdepth 1 -name '*.evt' -type f -printf '%f\n' | \
      split -l 999 -d - files_xselect.list.
    
    • -name ... 带有 quoted 文件名模式让 find 进行路径名扩展(与 shell 不同 - 让 shell 和 find 完成工作没有意义) .
    • -printf '%f\n' 确保只输出文件名(无路径组件),就像在 OP 中一样。
    • -l 999 以行为单位指定分割大小;默认为 1000。
    • -d 导致 numerical 后缀用于输出文件(0001、...)而不是默认字母(aaab、... ) [注意:不适用于 OSX];默认后缀长度为 2;控制数字/字符的数量。在后缀中使用-a {length}
    • - 导致 split 从标准输入读取 - 在这种情况下,来自 find 的输出。
    • files_xselect.list. 是输出文件前缀;因此,我们得到文件files_xselect.list.00, files_xselect.list.01, ...

    如果您想要对输出文件名进行更多控制 - 例如,将后缀数据移动到文件名的不同部分 - 您可以使用 --filter 选项(注意:不起作用在 OS X 上),它接受一个 shell 命令,每个文件的输出数据通过管道传输到该命令,以及包含相应输出文件名的变量 $FILE;这使您有机会根据它修改输出文件名:

    例如,要创建名为 files_xselect.00.list 的输出文件,... - 即,将后缀数据放在 文件扩展名之前,您可以使用:

    ... | split -l 999 -d --filter='> ${FILE}.list' - 'files_xselect.'
    

    【讨论】:

      【解决方案3】:

      有点像

      #!/bin/bash
      
      for file in ./J0902-405/*.evt; do
        [[ $i > 999 ]] && i=0 && j=$((j+1))
        [[ -f $file ]] && i=$((i+1)) && echo "${file##*/}" >> "fileofnames$j.txt"
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多