Bash-整齐地列出文件

Bash-整齐地列出文件,bash,Bash,我有一个不确定的文件名列表,我想在脚本中输出给用户。我不介意它是一段还是一列(比如ls的输出。ls如何管理它?)。事实上,我只有以下要求: 文件名必须保持在同一行(是的,这甚至意味着文件名中有空格。但是,如果有人愚蠢到在文件名中使用换行符,他们应该得到他们应得的。) 如果输出格式为段落,我希望看到它左右缩进,以便与其他文本分开。有点像apt get upgrade处理要安装的软件包列表的方式 我不想为此编写自己的函数——至少不是一个复杂的函数。linux中有很多文本格式化实用程序 该实用程序应该

我有一个不确定的文件名列表,我想在脚本中输出给用户。我不介意它是一段还是一列(比如
ls
的输出。
ls
如何管理它?)。事实上,我只有以下要求:

  • 文件名必须保持在同一行(是的,这甚至意味着文件名中有空格。但是,如果有人愚蠢到在文件名中使用换行符,他们应该得到他们应得的。)
  • 如果输出格式为段落,我希望看到它左右缩进,以便与其他文本分开。有点像
    apt get upgrade
    处理要安装的软件包列表的方式
  • 我不想为此编写自己的函数——至少不是一个复杂的函数。linux中有很多文本格式化实用程序
  • 该实用程序应该在默认的Ubuntu安装中可用
  • 它应该处理相对较大的输入,以防万一。大约2000个字符
  • 这似乎是一个简单的建议,但我似乎无法让它发挥作用。
    column
    命令退出,原因很简单,因为它无法处理大块数据
    fmt
    fold
    都不关心分隔符
    printf
    看起来可以正常工作。。。如果我为它写剧本的话


    有没有我忽略的更灵活的工具,或者简单的方法来实现这一点?

    如果变量中包含文件名,这将创建3列,您可以将-3更改为所需的任意列数

    echo "$var" | pr -3 -t
    
    或者,如果需要从文件系统获取它们:

    find . -printf "%f\n" 2>/dev/null | pr -3 -t 
    

    从你在评论中所说的,我认为这可能是你想要的。find命令打印文件或目录名以及一个换行符,您可以通过
    grep
    sed
    pr
    之前对文件名进行额外过滤,
    pr
    命令用于打印,
    -3
    表示
    3
    列,
    -t
    用于省略标题和拖车-您可以根据自己的喜好进行调整

    如果变量中包含文件名,这将创建3列,您可以将-3更改为所需的任意列数

    echo "$var" | pr -3 -t
    
    或者,如果需要从文件系统获取它们:

    find . -printf "%f\n" 2>/dev/null | pr -3 -t 
    

    从你在评论中所说的,我认为这可能是你想要的。find命令打印文件或目录名以及一个换行符,您可以通过
    grep
    sed
    pr
    之前对文件名进行额外过滤,
    pr
    命令用于打印,
    -3
    表示
    3
    列,
    -t
    用于省略标题和拖车-您可以根据自己的喜好进行调整

    如果变量中包含文件名,这将创建3列,您可以将-3更改为所需的任意列数

    echo "$var" | pr -3 -t
    
    或者,如果需要从文件系统获取它们:

    find . -printf "%f\n" 2>/dev/null | pr -3 -t 
    

    从你在评论中所说的,我认为这可能是你想要的。find命令打印文件或目录名以及一个换行符,您可以通过
    grep
    sed
    pr
    之前对文件名进行额外过滤,
    pr
    命令用于打印,
    -3
    表示
    3
    列,
    -t
    用于省略标题和拖车-您可以根据自己的喜好进行调整

    如果变量中包含文件名,这将创建3列,您可以将-3更改为所需的任意列数

    echo "$var" | pr -3 -t
    
    或者,如果需要从文件系统获取它们:

    find . -printf "%f\n" 2>/dev/null | pr -3 -t 
    

    从你在评论中所说的,我认为这可能是你想要的。find命令打印文件或目录名以及一个换行符,您可以通过
    grep
    sed
    pr
    之前对文件名进行额外过滤,
    pr
    命令用于打印,
    -3
    表示
    3
    列,
    -t
    用于省略标题和拖车-您可以根据自己的喜好进行调整

    这里我有一个简单的格式化程序,在我看来,它已经足够好了

    % ls | awk '
          NR==1 {for(i=1;i<9;i++)printf "----+----%d", i; print ""
                 line="  " $0;l=2+length($0);next}
                {if(l+1+length($0)>80){
                    print line; line = "  " $0 ; l = 2+length($0) ; next}
                {l=l+length($0)+1; line=line " " $0}}'
    ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
      3inarow.py 5s.py a.csv a.not1.pdf a.pdf as de.1 asde.1 asdef.txt asde.py a.sh
      a.tex auto a.wk bizarre.py board.py cc2012xyz2_5_5dp.csv cc2012xyz2_5_5dp.html
      cc.py col.pdf col.sh col.sh~ col.tex com.py data data.a datazip datidisk
      datizip.py dd.py doc1.pdf doc1.tex doc2 doc2.pdf doc2.tex doc3.pdf doc3.tex
      e.awk Exit file file1 file2 geomedian.py group_by_1st group_by_1st.2
      group_by_1st.mawk integers its.py join.py light.py listluatexfonts mask.py
      mat.rix my_data nostop.py numerize.py pepp.py pepp.pyc pi.pdf pippo muore
      pippo.py pi.py pi.tex pizza.py plocol.py points.csv points.py puddu puffo
    % 
    
    如您所见,在第一行中有足够的空间打印
    bia
    ,但没有足够的空间打印真正的文件名
    bia ncoodi
    ,因此在第二行中打印

    增编2 这是OP最终使用的格式化程序:

    local margin=4
    local max=10
    echo -e "$filenames" | awk -v width=$(tput cols) -v margin=$margin '
        NR==1 {
            for (i=0; i<margin; i++) {
                line = line " " 
            }
            line = line $0; 
            l = margin + margin + length($0);
            next;
        }
        {
            if (l+1+length($0) > width) {
                print line;
                line = ""
                for (i=0; i<margin; i++) line=line " " 
                line = line $0 ;
                l = margin + margin + length($0) ;
                next;
            }
            {
                l = l + length($0) + 1;
                line = line "  " $0; 
            }   
        }
        END {
            print line;
        }'
    
    localmargin=4
    本地最大值=10
    echo-e“$filenames”| awk-v width=$(tput cols)-v margin=$margin'
    NR==1{
    对于(i=0;i宽度){
    打印线;
    line=“”
    
    对于(i=0;i这里我有一个简单的格式化程序,在我看来,它已经足够好了

    % ls | awk '
          NR==1 {for(i=1;i<9;i++)printf "----+----%d", i; print ""
                 line="  " $0;l=2+length($0);next}
                {if(l+1+length($0)>80){
                    print line; line = "  " $0 ; l = 2+length($0) ; next}
                {l=l+length($0)+1; line=line " " $0}}'
    ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
      3inarow.py 5s.py a.csv a.not1.pdf a.pdf as de.1 asde.1 asdef.txt asde.py a.sh
      a.tex auto a.wk bizarre.py board.py cc2012xyz2_5_5dp.csv cc2012xyz2_5_5dp.html
      cc.py col.pdf col.sh col.sh~ col.tex com.py data data.a datazip datidisk
      datizip.py dd.py doc1.pdf doc1.tex doc2 doc2.pdf doc2.tex doc3.pdf doc3.tex
      e.awk Exit file file1 file2 geomedian.py group_by_1st group_by_1st.2
      group_by_1st.mawk integers its.py join.py light.py listluatexfonts mask.py
      mat.rix my_data nostop.py numerize.py pepp.py pepp.pyc pi.pdf pippo muore
      pippo.py pi.py pi.tex pizza.py plocol.py points.csv points.py puddu puffo
    % 
    
    如您所见,在第一行中有足够的空间打印
    bia
    ,但没有足够的空间打印真正的文件名
    bia ncoodi
    ,因此在第二行中打印

    增编2 这是OP最终使用的格式化程序:

    local margin=4
    local max=10
    echo -e "$filenames" | awk -v width=$(tput cols) -v margin=$margin '
        NR==1 {
            for (i=0; i<margin; i++) {
                line = line " " 
            }
            line = line $0; 
            l = margin + margin + length($0);
            next;
        }
        {
            if (l+1+length($0) > width) {
                print line;
                line = ""
                for (i=0; i<margin; i++) line=line " " 
                line = line $0 ;
                l = margin + margin + length($0) ;
                next;
            }
            {
                l = l + length($0) + 1;
                line = line "  " $0; 
            }   
        }
        END {
            print line;
        }'
    
    localmargin=4
    本地最大值=10
    echo-e“$filenames”| awk-v width=$(tput cols)-v margin=$margin'
    NR==1{
    对于(i=0;i宽度){
    打印线;
    line=“”
    
    对于(i=0;i这里我有一个简单的格式化程序,在我看来,它已经足够好了

    % ls | awk '
          NR==1 {for(i=1;i<9;i++)printf "----+----%d", i; print ""
                 line="  " $0;l=2+length($0);next}
                {if(l+1+length($0)>80){
                    print line; line = "  " $0 ; l = 2+length($0) ; next}
                {l=l+length($0)+1; line=line " " $0}}'
    ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
      3inarow.py 5s.py a.csv a.not1.pdf a.pdf as de.1 asde.1 asdef.txt asde.py a.sh
      a.tex auto a.wk bizarre.py board.py cc2012xyz2_5_5dp.csv cc2012xyz2_5_5dp.html
      cc.py col.pdf col.sh col.sh~ col.tex com.py data data.a datazip datidisk
      datizip.py dd.py doc1.pdf doc1.tex doc2 doc2.pdf doc2.tex doc3.pdf doc3.tex
      e.awk Exit file file1 file2 geomedian.py group_by_1st group_by_1st.2
      group_by_1st.mawk integers its.py join.py light.py listluatexfonts mask.py
      mat.rix my_data nostop.py numerize.py pepp.py pepp.pyc pi.pdf pippo muore
      pippo.py pi.py pi.tex pizza.py plocol.py points.csv points.py puddu puffo
    % 
    
    如您所见,在第一行中有足够的空间打印
    bia
    ,但没有足够的空间打印真正的文件名
    bia ncoodi
    ,因此在第二行中打印

    增编2 这是OP最终使用的格式化程序:

    local margin=4
    local max=10
    echo -e "$filenames" | awk -v width=$(tput cols) -v margin=$margin '
        NR==1 {
            for (i=0; i<margin; i++) {
                line = line " " 
            }
            line = line $0; 
            l = margin + margin + length($0);
            next;
        }
        {
            if (l+1+length($0) > width) {
                print line;
                line = ""
                for (i=0; i<margin; i++) line=line " " 
                line = line $0 ;
                l = margin + margin + length($0) ;
                next;
            }
            {
                l = l + length($0) + 1;
                line = line "  " $0; 
            }   
        }
        END {
            print line;
        }'
    
    localmargin=4
    本地最大值=10
    echo-e“$filenames”| awk-v width=$(tput cols)-v margin=$margin'
    NR==1{
    对于(i=0;i宽度){
    打印线;
    line=“”
    
    对于(i=0;i这里我有一个简单的格式化程序,在我看来,它已经足够好了

    % ls | awk '
          NR==1 {for(i=1;i<9;i++)printf "----+----%d", i; print ""
                 line="  " $0;l=2+length($0);next}
                {if(l+1+length($0)>80){
                    print line; line = "  " $0 ; l = 2+length($0) ; next}
                {l=l+length($0)+1; line=line " " $0}}'
    ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
      3inarow.py 5s.py a.csv a.not1.pdf a.pdf as de.1 asde.1 asdef.txt asde.py a.sh
      a.tex auto a.wk bizarre.py board.py cc2012xyz2_5_5dp.csv cc2012xyz2_5_5dp.html
      cc.py col.pdf col.sh col.sh~ col.tex com.py data data.a datazip datidisk
      datizip.py dd.py doc1.pdf doc1.tex doc2 doc2.pdf doc2.tex doc3.pdf doc3.tex
      e.awk Exit file file1 file2 geomedian.py group_by_1st group_by_1st.2
      group_by_1st.mawk integers its.py join.py light.py listluatexfonts mask.py
      mat.rix my_data nostop.py numerize.py pepp.py pepp.pyc pi.pdf pippo muore
      pippo.py pi.py pi.tex pizza.py plocol.py points.csv points.py puddu puffo
    % 
    
    如您所见,在第一行中有足够的空间打印
    bia
    ,但空间不够