Linux Bash使用*

Linux Bash使用*,linux,bash,sorting,imagemagick,tiling,Linux,Bash,Sorting,Imagemagick,Tiling,我写了一个脚本,访问每个目录,并使用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…命

我写了一个脚本,访问每个目录,并使用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_0001.png,im_0002.png…
时会保留顺序,但如果有人将图像命名为这样的名称,则会失败:
im_1.png,im_2.png
。。因为
im_10.png
im_2.png
之前,订单失败。一直手工修复文件名并不容易,有没有办法通过
*
枚举文件名,但强制使用数字顺序?我知道sort函数有这样的功能,但是如何在脚本中实现呢?由于文件名没有结构,我很好奇如何做到这一点。

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

#!/bin/bash

ext=.png

for f in *$ext; do
  num=$(basename "${f##*_}" $ext)
  mv "$f" "${f%_*}_$(printf "%04d" $num)$ext"
done

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

#!/bin/bash

ext=.png

for f in *$ext; do
  num=$(basename "${f##*_}" $ext)
  mv "$f" "${f%_*}_$(printf "%04d" $num)$ext"
done

您可以将此程序添加到系统中,例如
/usr/local/bin/human\u 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

您可以将此程序添加到系统中,例如
/usr/local/bin/human\u 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