【发布时间】:2015-05-04 06:24:01
【问题描述】:
有没有一种在 shell 中对目录内容(包括隐藏文件)进行排序的好方法?基本上我希望能够在我的 GUI 文件管理器中完成 ls 目录。在一个典型的目录中,输出是这样的:
.a_hidden_dir
.b_hidden_dir
.c_hidden_dir
a_dir
b_dir
c_dir
.a_hidden_file
.b_hidden_file
.c_hidden_file
一个文件
b_file
c_file
当然ls 有--group-directories-first 选项,但这只是让我们了解其中的一部分,因为sort 忽略了前导.,它不会将隐藏文件排序到顶部。
我希望能够以这种方式对来自ls、find 或其他路径列表的输出进行排序。有谁知道这样做的好方法 - 也许是sort -k KEYDEF?
现在我正在做这样的事情(它假设目录名称有一个斜杠附加到它们):
pathsort(){
input=$(cat)
(
awk '/^\..+\/$/' <<<"$input" | sort
awk '/^[^.].+\/$/' <<<"$input" | sort
awk '/^\..+[^/]$/' <<<"$input" | sort
awk '/^[^.].+[^/]$/' <<<"$input" | sort
) | sed 's/\/$//'
}
\ls -Ap | pathsort
上面的代码完成了工作,但远非理想。请告诉我有更好的方法...
【问题讨论】:
-
发布你期望的输出。
-
ls -la 不起作用?
-
可以通过运行
\ls -Ap获取示例输入。预期的示例输出在上面第一个引用的文本块中(以 .a_hidden_dir 开头)。ls -la当然可以“工作”,但我正在尝试对输出进行排序,隐藏的东西在顶部,就像在文件管理器中一样。我要它排序隐藏目录、目录、隐藏文件、文件。 -
您是否尝试过在环境中设置 LANG=C 以便按 C 顺序进行排序,其中带前导点的名称出现在大多数其他名称之前。
-
@JonathanLeffler 啊,谢谢,太简单了!我以前使用 LC_ALL=C 和
sort进行可重现的构建,但不知道 LANG=C。LANG=C \ls -A --group-directories-first正是我所需要的......而我在这里杰瑞操纵了一些可怕的装置。再次感谢!
标签: linux bash shell sorting awk