0

我编写了一个脚本来访问每个目录,并使用 imagemagick 对它们进行蒙太奇以用于游戏目的的平铺。

find . -type d | while read d; do
        # $k = filename generated from folder name
        montage -border 0 -geometry +0+0 -background none -tile 6x $d/* ~/tiles/$k.png
done

像这样命名图像时效果很好,因为使用 * 时会保留顺序:im_0001.png, im_0002.png...但是当有人将图像命名为这样时它会失败:im_1.png, im_2.png, .. 因为im_10.png在之前im_2.png并且顺序失败。一直手动修复文件名并不容易,有没有办法通过枚举文件名*但强制使用数字顺序?我知道 sort 函数具有该功能,但我如何在我的脚本中做到这一点?由于文件名没有结构,我很好奇如何做到这一点。

4

2 回答 2

2

我相信您必须先重命名文件:

#!/bin/bash

ext=.png

for f in *$ext; do
  num=$(basename "${f##*_}" $ext)
  mv "$f" "${f%_*}_$(printf "%04d" $num)$ext"
done
于 2013-06-27T11:54:20.650 回答
1

您可以将此程序添加到您的系统中,例如(例如)/usr/local/bin/human_sort

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import re

def sortable_list(s):
    elements=re.split( '(\d+)', s.rstrip() )
    for i in range(1, len(elements), 2):
        elements[i]=int(elements[i])
    return elements

for l in sorted(sys.stdin, key=sortable_list):
    sys.stdout.write(l)

之后,使用它对文件名进行排序。它看起来像这样:

=$ ls -1
a
i_1
i_10
i_15
i_20
i_8
i_9
k
m

=$ ls -1 | human_sort 
a
i_1
i_8
i_9
i_10
i_15
i_20
k
m
于 2013-06-27T12:41:06.513 回答