我想要一个名为 的文件夹DELETED
位于我的输出中的第一个ls
。
我可以在前面添加一个符号来导致这种情况吗?我已经尝试过了^
,但-
都不起作用。
答案1
^
,按 ASCII 顺序,跟在大写字母后面。-
位于所有字母和数字之前,但位于其他几个标点符号之后。
ASCII 可打印字符按顺序为:
!"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
`abcdefghijklmnopqrstuvwxyz{|}~
但这不一定对您有帮助,因为ls
列出文件的顺序可能会受到当前区域设置的影响。
您可以以空格或!
字符开头文件名,但这将导致在不引用文件的情况下很难引用该文件 - 而且区域设置可能会产生干扰。十进制数字之前的大多数其他 ASCII 字符也会有类似的问题。
假设您没有名称中包含奇数字符的其他文件,最好的选择可能是以字符串0
s 开头:
000_DELETED
(我在 Thunderbird 和 Outlook 中使用了类似的技术来命名电子邮件文件夹。)
答案2
在 GNU 系统上,至少在除 C/POSIX 之外的大多数语言环境中,有一些字符在排序时会被忽略。例如_
、.
、空格或 0x1 就是这种情况。
这就是为什么.a
, .c
, __b
,_d
排序为.a
, __b
, .c
,_d
例如。
对于由以下组成的字符串仅有的那些被忽略字符,排序顺序是在区域设置中定义的,ASCII SPC 通常排在第一位。因此,单个空格字符将是首先排序的文件(甚至在 0x1(C 语言环境中的第一个).
和之前..
),然后是 2 个空格...等等。但是,<SPC>DELETED
会排序后 DELETED
,因此,虽然名为的文件___
会在大多数其他文件之前排序,但放在___
其他字符串前面并不会使其排序更快。
在非忽略的字符中,ASCII 0 通常是非 C 语言环境中排在第一位的字符。
因此,名为 0 的文件将排在包含非忽略字符的任何其他文件之前。在包含非忽略字符的文件前面添加前缀0
将使其在非 C 语言环境中排序更早。
因此,名为 的文件$'\01\01\01_000_DELETED'
会在 C 语言环境中非常早地排序(因为 0x1 是第一个字符,因此首先排序),并且在其他语言环境中也会排序(因为所有 0x1 和 _ 都被忽略,但 s0
是不可忽略的字符首先排序)。
在非 C 语言环境中,它仍然会排序后 .
或者..
。
另一种选择可能是DELETED
仅使用忽略的字符进行写入,例如" ₫€£€₮€₫"
.这些货币符号在排序时会被忽略。 SPC 在 C 语言环境中也排序得相当早,因此.
在 C 语言环境和非 C 语言环境中它都应该排序在前面。
$ touch $' \u20ab\u20ac\u00a3\u20ac\u20ae\u20ac\u20ab' $'\01' ' ' 0normal-file $'\01\01\01_000_DELETED'
$ ls -1a
₫€£€₮€₫
./
../
?
???_000_DELETED
0normal-file
$ LC_ALL=C ls -1a
?
???_000_DELETED
????????????????????
./
../
0normal-file
$ LC_COLLATE=C ls -1a
?
???_000_DELETED
₫€£€₮€₫
./
../
0normal-file