Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl ls的Bash别名,通过“打印”打印多列;“类型”;_Perl_Bash_Find_Echo_Ls - Fatal编程技术网

Perl ls的Bash别名,通过“打印”打印多列;“类型”;

Perl ls的Bash别名,通过“打印”打印多列;“类型”;,perl,bash,find,echo,ls,Perl,Bash,Find,Echo,Ls,我只列出了带有ls命令的文件基名,如下所示,这是我从: 我想在第一列列出所有目录,在下一列列出所有可执行文件,最后列出所有常规文件(可能每个扩展名都有一列) 因此,第一个(也是主要的)“挑战”是打印多个不同长度的列 你有什么建议我应该用什么命令来写那个脚本吗?我应该切换到查找?还是我应该用Perl编写脚本 我还希望能够选择按大小对列进行排序;-)我不一定要找一个脚本来完成上述任务,但可能需要一些关于如何编写这样一个脚本的建议。#/bin/bash #!/bin/bash width=20 a

我只列出了带有ls命令的文件基名,如下所示,这是我从:

我想在第一列列出所有目录,在下一列列出所有可执行文件,最后列出所有常规文件(可能每个扩展名都有一列)

因此,第一个(也是主要的)“挑战”是打印多个不同长度的列

你有什么建议我应该用什么命令来写那个脚本吗?我应该切换到
查找
?还是我应该用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 {} +)