如何从Linux命令行数字sorting文件

好吧,现在这更多的是关于Linux而不是一个问题,但也许有人知道如何做我想要的。 我知道这可以 通过使用sort命令来实现 ,但我想要一个更好的解决scheme,因为让它工作就像编写一个C程序来做同样的事情一样简单。

我有文件,为了参数,可以说我有这些文件:(我的文件是一样的,我只是有更多的)

  • 文件10.xml
  • 文件20.xml
  • 文件100.xml
  • 文件k10.xml
  • 文件k20.xml
  • 文件k100.xml
  • 文件M10.xml
  • 文件M20.xml
  • 文件M100.xml

现在,事实certificate,我想要他们sorting顺序。顺便说一下,这是在Windows中 ,他们默认sorting到的顺序。 这很好。 Windows将连续的数字字符组合成一个有效的字符 ,在字母之前按字母顺序sorting。

如果我在linux命令行键入ls ,我得到以下垃圾。 注意这20个是被移动的。 当我想要在报告中查看数百个这样的文件时,这是一个更大的交易。

  • 文件100.xml
  • 文件10.xml
  • 文件20.xml
  • 文件k100.xml
  • 文件k10.xml
  • 文件k20.xml
  • 文件M100.xml
  • 文件M10.xml
  • 文件M20.xml

我可以使用ls -1 | sort -n -k 1.6 ls -1 | sort -n -k 1.6得到那些没有'k'或'M'正确的…

  • 文件k100.xml
  • 文件k10.xml
  • 文件k20.xml
  • 文件M100.xml
  • 文件M10.xml
  • 文件M20.xml
  • 文件10.xml
  • 文件20.xml
  • 文件100.xml

我可以使用ls -1 | sort -n -k 1.7 ls -1 | sort -n -k 1.7得到它没有正确的

  • 文件100.xml
  • 文件10.xml
  • 文件20.xml
  • 文件k10.xml
  • 文件M10.xml
  • 文件k20.xml
  • 文件M20.xml
  • 文件k100.xml
  • 文件M100.xml

好的。 让我们真正做到。 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

  • 文件10.xml
  • 文件20.xml
  • 文件100.xml
  • 文件k10.xml
  • 文件k20.xml
  • 文件k100.xml
  • 文件M10.xml
  • 文件M20.xml
  • 文件M100.xml

呼! 男孩高兴的“Linux命令行的力量”救了我在那里。 (这对于我的情况是不实际的,因为不是ls -1我有另外一行或两行的命令)

现在,Windows的行为是简单的,优雅的,并做你想做的事99%的时间。 为什么我不能在Linux? 为什么哦为什么sort没有一个“不能让我头撞墙”的方式的自动sorting?

这里是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; } 

这么难吗? 有人可以把这个sorting,给我一个副本? 请?

这将是我的第一个想法:

 ls -1 | sed 's/\-\([kM]\)\?\([0-9]\{2\}\)\./-\10\2./' | sort | sed 's/0\([0-9]\{2\}\)/\1/' 

基本上我只是使用sed填充零的数字,然后再次使用它剥离前导零。

我不知道在Perl中可能会更快。

尝试排序–version-sort -f

  • 文件10.xml
  • 文件20.xml
  • 文件100.xml
  • 文件k10.xml
  • 文件k20.xml
  • 文件k100.xml
  • 文件M10.xml
  • 文件M20.xml
  • 文件M100.xml

-f选项是忽略大小写(否则,在这个例子中会把k和M的顺序错误)。 但是,我认为排序并不能把字母k和M正确地解释为数以千万计,如果那是你的目标 – 它只是字母顺序。

ls -1v会让你非常接近。 它只是将所有大写字母排在小写之前。