有没有一种很好的方法来对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
a_file
b_file
c_file
当然ls有--group-directories-first选项,但这只是我们的一部分,因为sort忽略了前导.,它没有将隐藏文件排在顶部。
我希望能够以这种方式对ls,find或其他路径列表中的输出进行排序。 有谁知道这样做的好方法 - 也许sort -k KEYDEF?
现在我正在做这样的事情(它假设目录名称有一个斜杠附加到它们):
pathsort(){
input=$(cat)
(
awk &#39;/^\..&#43;\/$/&#39; <<
awk &#39;/^[^.].&#43;\/$/&#39; <<
awk &#39;/^\..&#43;[^/]$/&#39; <<
awk &#39;/^[^.].&#43;[^/]$/&#39; <<
) | sed &#39;s/\/$//&#39;
}
\ls -Ap | pathsort
上面的代码完成了工作&#xff0c;但它远非理想。 请告诉我有更好的方法......
发布您期望的输出。
ls -la不工作&#xff1f;
可以从运行\ls -Ap获得样本输入。 预期的样本输出位于上面第一个引用的文本块中(以.a_hidden_dir开头)。 ls -la当然"工作"&#xff0c;但我试图将输出排序&#xff0c;隐藏的东西在顶部&#xff0c;就像它在文件管理器中一样。 我想要它订购隐藏的目录&#xff0c;目录&#xff0c;隐藏文件&#xff0c;文件。
您是否尝试在环境中设置LANG &#61; C&#xff0c;以便按C顺序完成排序&#xff0c;其中带有前导点的名称出现在大多数其他名称之前。
&#64;JonathanLeffler啊谢谢你&#xff0c;就这么简单&#xff01; 我之前使用LC_ALL &#61; C和sort进行了可重现的构建&#xff0c;但是不知道LANG &#61; C. LANG&#61;C \ls -A --group-directories-first正是我所需要的......而且我在这里操纵一些可怕的装置。 再次感谢&#xff01;
对于ls和sort&#xff0c;您可以使用LC_ALL代替LANG&#xff0c;或者使用LANG。 你也应该能够使用LC_COLLATE; 这是最精确的。
Jonathan Leffler在评论中提出了一个简单而实用的解决方案&#xff1a;设置本地环境变量LANG&#61;C。在我的系统上&#xff0c;默认的LANG&#61;en_US.UTF-8会导致不合需要的路径名排序特征。 C显然是指使用ASCII字符集的字节字符排序。设置LANG&#61;C的结果是&#39;dotfiles&#39;(包括目录)被排序到顶部。注意也可以使用LC_ALL&#61;C&#xff0c;因为LC_ALL是LANG和其他LC_*变量的超集。总而言之&#xff0c;如果您想要一致的排序体验&#xff0c;强烈建议将语言环境设置为C以排序命令。
这是所需路径名排序层次结构的最终解决方案(dotfile dirs>普通dirs> dotfile文件>普通文件)&#xff1a;
LC_ALL&#61;C ls -A --group-directories-first
注意&#xff1a;这还包括文件和目录的符号链接
类似地&#xff0c;为了排序任何其他路径名输出源&#xff1a;
findtool | LC_ALL&#61;C sort
有趣的是&#xff0c;我认为对目录进行排序是最简单的&#xff1a;
ls -1d .*/; ls -1d */
文件更难与目录分离&#xff0c;您需要使用find&#xff1a;
(find . -maxdepth 1 -type f -name &#39;.*&#39; -printf &#39;%P
&#39; | sort); (find . -maxdepth 1 -type f -not -name &#39;.*&#39; -printf &#39;%P
&#39; | sort)
把整个事情放在一起&#xff1a;
alias lss&#61;"
ls -1d .*/; # Hidden directories
ls -1d */; # Normal directories
find . -maxdepth 1 -type f -name &#39;.*&#39; -printf &#39;%P
&#39; | sort;
# Hidden files
find . -maxdepth 1 -type f -not -name &#39;.*&#39; -printf &#39;%P
&#39; | sort
# Normal files
"
一个警告&#xff1a;还有其他一些项目会丢失&#xff0c;比如链接和设备。
你的lsd看起来不错。 我使用lsd (find -L -maxdepth 1 -type d -name &#39;.*&#39; -printf &#39;%P
&#39; | sort; find -L -maxdepth 1 -mindepth 1 -type d ! -name &#39;.*&#39; -printf &#39;%P
&#39; | sort)和lsf (find -L -maxdepth 1 -type f -name &#39;.*&#39; -printf &#39;%P
&#39; | sort; find -L -maxdepth 1 -type f ! -name &#39;.*&#39; -printf &#39;%P
&#39; | sort)完成了与第二个示例非常相似的操作。 -L将捕获到dirs /文件的链接。 我希望能够对其他输出进行排序......结果证明这是一件非常复杂的事情。 您可以通过LC_ALL&#61;C \ls -A --g获得所需的排序。&#xff1a;P
是的&#xff0c;也许您应该通过更新回答您自己的问题&#xff0c;并将其标记为已回答。 这样&#xff0c;可能有类似问题的其他人会看到你的答案。