1

我有一个文件列表(从 管道传输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

我正在将此列表传送到 ImageMagickconvert函数中以将其转换为 PDF,因此最好按正确的顺序排列文件,如上所述。但是,ls没有自然排序,导致 1-10-11-12-2-20 乱七八糟;ls -v自然地对它们进行排序,但将 Maps 放在开头,并且我发现的各种awk功能sort无法处理 Map 位并造成更有趣的混乱。

我认为获取输出ls -v并使用 awk 将包含字符串 'map' 的每一行移动到末尾可能并不难,但我不知道该怎么做。

4

2 回答 2

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]; }'
于 2013-02-19T05:18:02.443 回答
1

你也可以通过两次调用ls和一些glob/extended-glob 模式来做到这一点:

{ ls -v !(*Map*); ls -v *Map*; } | convert ...
于 2013-02-19T06:00:09.373 回答