我有一个非确定的文件名列表,我想在脚本中输出给用户。我不介意它是段落还是列(如ls
的输出。ls
如何管理它?)。实际上我只有以下要求:
apt-get upgrade
处理要安装的软件包列表的方式。这似乎是一个简单的命题,但我似乎无法让它发挥作用。 column
命令只是因为它无法处理大块数据。 fmt
和fold
都不关心分隔符。 printf
看起来会起作用......如果我为它编写了一个脚本。
是否有一个我忽略的更灵活的工具,还是一种简单的方法?
答案 0 :(得分:1)
如果您在变量中包含文件名,则会创建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
列和{{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
,因此会打印在第二行。
这是OP最终选择的格式化程序:
bia nconodi
答案 2 :(得分:1)
也许您正在寻找/usr/bin/fold
?
printf '%s ' * | fold -w 77 | sed -e 's/^/ /'
当然,将*
替换为您的列表;如果你的文件在一个数组中(它们应该是;在标量变量中存储文件名是有损的),那就是"${your_array[@]}"
。