【问题标题】:Bash alias for ls that prints multiple columns by "type"按“类型”打印多列的 ls 的 Bash 别名
【发布时间】:2023-03-19 12:40:01
【问题描述】:

我使用这样的 ls 命令仅列出文件基名,我从 here 获得:

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

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

所以第一个(也是主要的)“挑战”是打印多个不同长度的列。

您对我应该使用哪些命令来编写该脚本有什么建议吗?我应该切换到find 吗?还是我应该只用 Perl 编写脚本?

我也希望能够选择按大小对列进行排序 ;-) 我不一定要寻找一个脚本来执行上述操作,但也许是一些关于编写此类脚本的方法的建议。

【问题讨论】:

  • ls --sort=extension --group-directories-first 可能会有所帮助。
  • 另见-x-C 选项。

标签: perl bash find echo ls


【解决方案1】:
#!/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

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

【讨论】:

  • 我不确定格式字符串是否正常工作,我在尝试时会得到完整的文件名长度。但颜色让我印象深刻。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
相关资源
最近更新 更多