以正确的字母数字顺序获取文件名

问题描述 投票:0回答:2

我希望这是正确的论坛。

我在使用此命令时遇到麻烦(怀疑它与bash有关,而与程序无关)

montage -verbose -label '%f' -font Helvetica -pointsize 10 -background '#ffffff' -fill 'gray' -auto-orient  -tile 8x6 -geometry 200x200+2+2 ./*.bluemap.jpg /media/

问题是它以文件100002.bluemap.jpg开头,而不是最低的数字,即2016.bluemap.jpg

不存在所有数字,例如2016年之后的下一个数字是6438、6685、9879

反正有没有让它正确地完成工作,正确的顺序?

还是我需要创建一些列表或其他内容?

我有点迷路了。

bash sorting glob
2个回答
1
投票
使用GNU sort将文件名排序,并将列表读入数组,然后在montage调用中将其展开。

readarray -d '' -t files < <(printf '%s\0' ./*.bluemap.jpg | sort -z -t/ -k2n) montage -verbose -label '%f' -font Helvetica -pointsize 10 -background '#ffffff' -fill 'gray' -auto-orient -tile 8x6 -geometry 200x200+2+2 "${files[@]}" /media/

参见:


0
投票
@oguz ismail's answer的一种变体,使用xargs来流传输文件名参数而不是Bash数组。

printf '%s\0' ./*.bluemap.jpg | sort -z -t/ -k2n | xargs -i'{}' -0 -n $((2**63-1)) \ montage \ -verbose \ -label '%f' \ -font 'Helvetica' \ -pointsize 10 \ -background '#ffffff' \ -fill 'gray' \ -auto-orient \ -tile 8x6 \ -geometry 200x200+2+2 \ {} \ /media/

xargs -i'{}' -0 -n $((2**63-1))的分割说明:

    -i'{}':告诉xargs用从{}的流中读取的参数替换stdin字符串。
  • [-0:输入流中的条目由null分隔。
  • -n $((2**63-1)):设置单次调用命令的最大参数数。 (这里2⁶³-1是64位整数的最大值)
© www.soinside.com 2019 - 2024. All rights reserved.