用于按“类型”打印多个列的ls的bash别名

时间:2011-03-18 02:36:49

标签: perl bash find echo ls

我只列出了像这样的ls命令的文件basenames,这是我从here得到的:

ls --color -1 . | tr '\n' '\0' | xargs -0 -n 1 basename

我想列出第一列中的所有目录,下一个中的所有可执行文件,所有常规文件的最后一个(也许还有每个扩展名的列)。

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

您是否有任何建议我应该使用哪些命令来编写该脚本?我应该切换到find吗?或者我应该只在Perl中编写脚本吗?

我希望能够按大小选择对列进行排序;-)我不一定要找一个脚本来执行上述操作,但也许可以就编写这样一个脚本的方法提出一些建议。

1 个答案:

答案 0 :(得分:4)

#!/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 {} +)

示例输出HERE

这可以通过计算每列的最长条目并将其用作宽度来进一步改进。我会将其作为练习留给读者