Shell脚本自然地(非字母数字地)排序文件列表,增加了困难

时间:2013-02-19 05:02:27

标签: shell sorting awk

我有一个文件列表(来自ls)。理想情况下,我希望它看起来像这样:

THISPARTISALWAYSTHESAME200_1.JPG
THISPARTISALWAYSTHESAME200_2.JPG
THISPARTISALWAYSTHESAME200_3.JPG
[...]
THISPARTISALWAYSTHESAME200_9.JPG
THISPARTISALWAYSTHESAME200_9_1.JPG
THISPARTISALWAYSTHESAME200_9_2.JPG
[...]
THISPARTISALWAYSTHESAME200_9_10.JPG
THISPARTISALWAYSTHESAME200_9_11.JPG
[...]
THISPARTISALWAYSTHESAME200_9_47.JPG
THISPARTISALWAYSTHESAME200_9_48.JPG
THISPARTISALWAYSTHESAME200_9_49.JPG
THISPARTISALWAYSTHESAME200Map_001.JPG
THISPARTISALWAYSTHESAME200Map_002.JPG

我正在将此列表汇总到ImageMagick convert函数中以使其成为PDF,因此如上所述将文件按正确的顺序排列会很不错。但是,ls不会自然地对它们进行排序,导致1-10-11-12-2-20混乱; ls -v自然地对它们进行排序,但是将地图置于开头,我发现的各种awksort函数无法处理Map位并使其变得更加有趣。

我认为使用ls -v的输出并使用awk将包含字符串'map'的每一行移动到最后可能不是那么困难,但我不知道如何去做

2 个答案:

答案 0 :(得分:2)

ls -v | awk '{ if($0!~/Map/) print $0; else later[NR]=$0; } END { for (i=1; i<=NR; i++) if ( i in later ) print later[i]; }'

答案 1 :(得分:1)

您也可以通过两次ls和一些glob/extended-glob patterns的调用来执行此操作:

{ ls -v !(*Map*); ls -v *Map*; } | convert ...