这不仅是关于Linux的发泄,也是一个问题,但也许有人知道如何做到我想要的。我知道使用sort
命令可以实现,但我希望有更好的方法,因为让它工作起来就像编写C程序那样困难。
举个例子,我有以下文件:
- file-10.xml
- file-20.xml
- file-100.xml
- file-k10.xml
- file-k20.xml
- file-k100.xml
- file-M10.xml
- file-M20.xml
- file-M100.xml
我希望它们按照以下顺序排序,这正是Windows默认排序的方式。 Windows将连续的数字字符组合成一个有效字符,然后按字母表顺序排列。
在Linux命令行中输入ls
命令,会得到下面的结果。注意,数字20被错位了。当我想按顺序查看数百个这样的文件时,这是一个更大的问题。
我可以使用ls -1 | sort -n -k 1.6
来获取没有'k'或'M'的正确顺序...
如果我使用ls -1 | sort -n -k 1.7
,则完全不正确。
让我们真正地把它弄对。 ls -1 | grep "file-[0-9]*\.xml" | sort -n -k1.6 && ls -1 file-k*.xml | sort -n -k1.7 && ls -1 file-M*.xml | sort -n -k1.7
Windows的行为简单、优雅,并且在99%的情况下都能做到你想做的事情。为什么Linux不能这样做?为什么sort
没有一个“自动排序数字而不让我撞墙”的开关呢?
以下是C++的伪代码:
bool compare_two_strings_to_avoid_head_injury(string a, string b)
{
string::iterator ai = a.begin();
string::iterator bi = b.begin();
for(; ai != a.end() && bi != b.end(); ai++, bi++)
{
if (*ai is numerical)
gobble up the number incrementing ai past numerical chars;
if (*bi is numerical)
gobble up the number incrementing bi past numerical chars;
actually compare *ai and *bi and/or the gobbled up number(s) here
to determine if we need to compare more chars or can return the
answer now;
}
return something here;
}
那有那么难吗?有人能将这个排序并给我一份副本吗?求求了?
dir
将连续的数字分组为“有效字符”,而ls
则不会。尽管从技术上讲,这是dir
程序的怪癖,而不是Windows的怪癖。同样,你所谓的Linux问题实际上是一个特定程序sort
的“问题”。(此外,它并不像合法的错误那样成为问题,它只是一个设计决策,恰好不符合你的要求。这在每个平台上都会时有发生。) - David Z