在不区分大小写的情况下,如何使“ ls”首先显示点文件?

斯帕霍克

在目录中创建以下文件。

$ touch .a .b a b A B 你好嗎

我的默认ls顺序忽略了前导点的存在,将它们与其他文件混合在一起。

$ ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:06 你好嗎

可以 更改 LC_COLLATE为将点文件放在第一位。

$ LC_COLLATE=C ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:06 你好嗎

不幸的是,这使得排序顺序区分大小写,即AB普瑞森ab有没有一种方法在不区分大小写的情况下(A以及beforea打印点文件Bb

编辑:尝试修改LC_COLLATE

到目前为止,没有一个答案能完全ls轻松地复制出功能可以想象,我可以将其中的一些包装在一个函数中,但这将必须包含一些详细的代码,例如(无参)与提供目录作为参。或如何处理显式-d标志。

另外,我认为也许会有更好LC_COLLATE的使用方法。但是,我似乎无法做到这一点。我目前正在使用LC_COLLATE="en_AU.UTF-8"我检查了一下/usr/share/i18n/locales/en_AU(尽管我不确定这是否是正确的文件,因为我看不到任何引用UTF-8);我发现了以下内容。

LC_COLLATE
copy "iso14651_t1"
END LC_COLLATE

/usr/share/i18n/locales/iso14651_t1包含copy "iso14651_t1_common"最后/usr/share/i18n/locales/iso14651_t1_common包含

 <U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .

我删除了这一行,运行sudo locale-gen,然后重新启动计算机。不幸的是,这并没有改变。

比安迪普

OP与编辑非常接近/usr/share/i18n/locales/iso14651_t1_common,但诀窍是不删除该行

<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .

而是将其修改为

<U002E> <RES-1>;IGNORE;IGNORE;<U002E> # 47 .

为什么这样工作

IGNORE语句指定句号(又名期间,或字符<U002E>的字母顺序排序的话时)将被忽略。要使您的点文件排在第一位,请更改IGNORE为一个在所有其他字符之前的排序符号。归类符号由如下行定义

collating-symbol <something-inside-angle-brackets>

它们是按行的外观排序的

<something-inside-angle-brackets>

在我的副本中iso14651_t1_common,第一个排序规则符号是<RES-1>,显示在3458行上。如果文件不同,请使用顺序排序的任何排序规则符号。

有关使用LC_COLLATE进行字符排序的详细信息

<U002E>之所以有3条IGNORE陈述,是因为在有联系的情况下可以多次比较字母。要理解这一点,请考虑小写a和大写A(它们是一组实际上被比较了四次的字符的一部分):

<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A

进行多轮比较可以使以“ a”和“ A”开头的文件归为一组,因为与<a>第一次通过时一样,两者都进行了比较,而下一个字母确定了顺序。如果以下所有字母都相同(例如a.txtA.txt),则第三遍将排在a.txt第一位,因为小写字母的校对符号<MIN>出现在第3467行,大写字母的校对符号之前<CAP>(第3488行)。

实施此变更

如果希望每次程序使用来订购字母首先出现句号LC_COLLATE,则可以iso14651_t1_common如上所述进行修改并重建位置文件。但是,如果你想使这一变化ls和无根的访问,可以将原有的语言文件修改之前复制到另一个目录。

我做了什么

我的默认语言环境是en_US,所以我复制en_USiso14651_t1以及iso14651_t1_common$HOME/path/to/new/locales在那里,我对进行了上述更改,iso14651_t1_common并将其重命名en_USen_DOTFILE接下来,我使用编译了en_DOTFILE语言环境

localedef -i en_DOTFILE -f UTF-8 -vc $HOME/path/to/new/locales/en_DOTFILE.UTF-8

要替换默认的ls顺序,请制作一个名为的BASH脚本ls

#!/bin/bash
LOCPATH=$HOME/path/to/new/locales LANG=en_DOTFILE.UTF-8 ls "$@"

将其保存/usr/bin在路径上之前出现的位置,并使用使其可执行chmod +x ls

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使“ ls”首先显示点文件?

不区分大小写的文件系统如何访问文件?

“ ls”或regex不区分大小写?

不区分大小写的文件系统如何同时显示大写和小写文件名?

获取不区分大小写的文件名,区分大小写

不区分大小写的File.equals在区分大小写的文件系统上

在Linux下的Ruby中以不区分大小写的方式打开文件

/var/www 下的文件在 Ubuntu 14.04 上不区分大小写

默认情况下如何使描述函数“ Ch f”不区分大小写

如何在不区分大小写的情况下按字母顺序排序?

如何在不区分大小写的情况下从ressourceManager获取对象?

TextView中不区分大小写的突出显示

SwiftUI:如何在ForEach循环中不显示“不区分大小写”

在Bash中,如何比较两个文件(不区分大小写)

如何遍历具有已排序空间(不区分大小写)的文件列表?

如何从两个文件中提取不常见的不区分大小写的文本?

如何为PDF文件设置不区分大小写的密码?

如何在Perl中检测不区分大小写的文件系统?

如何使用Nginx不区分大小写地提供静态文件?

如何在Erlang / Elixir中执行不区分大小写的文件搜索

如何以不区分大小写的方式将文件复制到HDFS

如何在Python中对给定后缀的文件执行不区分大小写的搜索?

如何对给定后缀的文件执行不区分大小写的搜索?

P4:如何以不区分大小写的方式查找文件?

PHP-不区分大小写的文件搜索

不区分大小写的文件检查是否为RewriteCond

不区分大小写地加载Excel文件表

以不区分大小写的方式搜索文件?

CMake 添加不区分大小写的源文件