Bash - 整齐地列出文件

时间:2014-11-11 21:43:40

标签: bash

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

  1. 文件名需要保持在同一行(是的,这甚至意味着名字中有空格的文件。如果某人愚蠢到足以在文件名中使用换行符,他们应该得到他们得到的东西。)
  2. 如果输出格式化为段落,我希望看到它在左侧和右侧缩进以将其与其他文本分开。类似于apt-get upgrade处理要安装的软件包列表的方式。
  3. 我不想为此写自己的功能 - 至少不是一个复杂的功能。 linux中有很多文本格式化工具!
  4. 该实用程序应该在默认的Ubuntu安装中可用。
  5. 它应该处理相对较大的输入,以防万一。像2000个字左右的东西?
  6. 这似乎是一个简单的命题,但我似乎无法让它发挥作用。 column命令只是因为它无法处理大块数据。 fmtfold都不关心分隔符。 printf看起来会起作用......如果我为它编写了一个脚本。

    是否有一个我忽略的更灵活的工具,还是一种简单的方法?

3 个答案:

答案 0 :(得分:1)

如果您在变量中包含文件名,则会创建3列,您可以将-3更改为您想要的任意列数

echo "$var" | pr -3 -t

或者如果你需要从文件系统中获取它们:

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

根据您在评论中所说的内容,我认为这可能是您正在寻找的内容。 find命令打印文件或目录名称以及换行符,您可以在grep - sed之前通过管道prpr对文件名进行额外过滤。-3命令用于打印,3状态-t列和{{1}}用于省略标题和预告片 - 您可以根据自己的喜好进行调整。

答案 1 :(得分:1)

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

% 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
% 

我必须使用ls模拟输入,因为您不想显示如何访问您的文件列表。窗口宽度也是任意的,但很容易为-V width=...的{​​{1}}选项提供值

修改

我在我的awk脚本中添加了一个标题行,一条未经请求的标题行,因为我想测试(非常简单)算法的有效性。

附录

我想强调的是, 上面的简单格式化程序不会跨行 拆分“文件名”,如下例所示:

awk

正如您所看到的,在第一行中有足够的空间来打印% ls -d1 b* bia nconodi bianconodi.pdf bianconodi.ppt bin b.txt % 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 04_Tower.pdf 2plots.py 2.txt a.csv aiuole asdefff a.txt a.txt~ auto bia nconodi bianconodi.pdf bianconodi.ppt bin Borsa Ferna.jpg b.txt ... % ,但不足以打印真实的文件名bia,因此会打印在第二行。

附录2

这是OP最终选择的格式化程序:

bia nconodi

答案 2 :(得分:1)

也许您正在寻找/usr/bin/fold

printf '%s ' * | fold -w 77 | sed -e 's/^/   /'

当然,将*替换为您的列表;如果你的文件在一个数组中(它们应该是;在标量变量中存储文件名是有损的),那就是"${your_array[@]}"