从ls命令对输出进行排序

时间:2013-08-30 10:23:20

标签: sorting ls

我正在尝试对ls的输出进行排序。我要求的顺序是:

  • 名称以_
  • 开头的所有目录
  • 名称以+
  • 开头的所有目录
  • 所有软链接(可能包含一些点文件)
  • 所有剩余的.files
  • 所有剩余的.directories
  • 其他一切

在这些“子列表”中,所有内容都按字母顺序排序。目前,我多次使用find命令查找符合上述条件的文件。接下来,我将find的输出传递给sort,然后将整个排序列表传递给ls:

#!/bin/bash

find1=`find . -maxdepth 1 -name "_*" -type d -printf "%f\n" | sort`
find2=`find . -maxdepth 1 -name "+*" -type d -printf "%f\n" | sort`
find3=`find . -maxdepth 1 -type l -printf "%f\n" | sort`
find4=`find . -maxdepth 1 -name ".*" -type f -printf "%f\n" | sort`
find5=`find . -maxdepth 1 \( ! -name "."  \) -name ".*" -type d -printf "%f\n" | sort`
find6=`find . -maxdepth 1 \( ! -name "_*" \) \( ! -name "+*" \) \( ! -name ".*" \) \( ! -type l \) -printf "%f\n"`
find="$find1 $find2 $find3 $find4 $find5 $find6"
ls -dfhlF --color=auto $find

这不处理任何包含空格的名称,总体看起来有点过分。我确信有更好的方法可以做到这一点。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这对你有用吗?它按您指定的顺序打印文件,但不会以彩色打印。为此,您需要在模式匹配之前从名称中剥离ANSI代码。实际上,它将处理带有嵌入空格的文件名,但不会处理具有嵌入式换行符或控制字符的可怕病态名称。

我认为awk脚本是相当不言自明的,但如果您想澄清,请告诉我。在BEGIN输出开始之前处理ls行,并在消耗所有输出后处理END行。其他行以可选条件开头,后跟用大括号括起来的一系列命令。命令在(仅)那些符合条件的行上执行。

ls -ahlF --color=none | awk '
  BEGIN { name_col = 45 }
  { name = substr($0, name_col) }
  name == "" { next }
  /^d/ && substr(name, 1, 1) == "_" { under_dirs = under_dirs $0 "\n"; next }
  /^d/ && substr(name, 1, 1) == "+" { plus_dirs = plus_dirs $0 "\n"; next }
  /^l/ { links = links $0 "\n"; next }
  /^[^d]/ && substr(name, 1, 1) == "." { dot_files = dot_files $0 "\n"; next }
  /^d/ && substr(name, 1, 1) == "." { dot_dirs = dot_dirs $0 "\n"; next }
  { others = others $0 "\n" }
  END { print under_dirs plus_dirs links dot_files dot_dirs others }
'