Perl ls的Bash别名,通过“打印”打印多列;“类型”;
我只列出了带有ls命令的文件基名,如下所示,这是我从: 我想在第一列列出所有目录,在下一列列出所有可执行文件,最后列出所有常规文件(可能每个扩展名都有一列) 因此,第一个(也是主要的)“挑战”是打印多个不同长度的列 你有什么建议我应该用什么命令来写那个脚本吗?我应该切换到Perl ls的Bash别名,通过“打印”打印多列;“类型”;,perl,bash,find,echo,ls,Perl,Bash,Find,Echo,Ls,我只列出了带有ls命令的文件基名,如下所示,这是我从: 我想在第一列列出所有目录,在下一列列出所有可执行文件,最后列出所有常规文件(可能每个扩展名都有一列) 因此,第一个(也是主要的)“挑战”是打印多个不同长度的列 你有什么建议我应该用什么命令来写那个脚本吗?我应该切换到查找?还是我应该用Perl编写脚本 我还希望能够选择按大小对列进行排序;-)我不一定要找一个脚本来完成上述任务,但可能需要一些关于如何编写这样一个脚本的建议。#/bin/bash #!/bin/bash width=20 a
查找?还是我应该用Perl编写脚本
我还希望能够选择按大小对列进行排序;-)我不一定要找一个脚本来完成上述任务,但可能需要一些关于如何编写这样一个脚本的建议。#/bin/bash
#!/bin/bash
width=20
awk -F':' '
/directory/{
d[i++]=$1
next
}
/executable/{
e[j++]=$1
next
}
{
f[k++]=$1
}
END{
a[1]=i;a[2]=j;a[3]=k
asort(a)
printf("%-*.*s | \t%-*.*s | \t%-*.*s\n", w,w,"Directories", w,w,"Executables", w,w,"Files")
print "------------------------------------------------------------------------"
for (i=0;i<a[3];i++)
printf("%-*.*s |\t%-*.*s |\t%-*.*s\n", w,w,d[i], w,w,e[i], w,w,f[i])
}' w=$width < <(find . -exec file {} +)
宽度=20
awk-F':''
/目录/{
d[i++]=1美元
下一个
}
/可执行/{
e[j++]=$1
下一个
}
{
f[k++]=1美元
}
结束{
a[1]=i;a[2]=j;a[3]=k
asort(a)
printf(“%-*.*s |\t%-*.*s |\t%-*.*s\n”,w,w,“目录”,w,w,“可执行文件”,w,w,“文件”)
打印“--------------------------------------------------------------”
对于(i=0;i
这可以通过计算每列最长条目的长度并将其用作宽度来进一步改进。我将把它作为练习留给读者我不确定格式字符串是否正常工作,我在尝试时会得到文件名的完整长度。但颜色给我留下了深刻的印象。:)ls--sort=extension--group directories first
可能会有所帮助。另请参见-x
和-C
选项。
#!/bin/bash
width=20
awk -F':' '
/directory/{
d[i++]=$1
next
}
/executable/{
e[j++]=$1
next
}
{
f[k++]=$1
}
END{
a[1]=i;a[2]=j;a[3]=k
asort(a)
printf("%-*.*s | \t%-*.*s | \t%-*.*s\n", w,w,"Directories", w,w,"Executables", w,w,"Files")
print "------------------------------------------------------------------------"
for (i=0;i<a[3];i++)
printf("%-*.*s |\t%-*.*s |\t%-*.*s\n", w,w,d[i], w,w,e[i], w,w,f[i])
}' w=$width < <(find . -exec file {} +)