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