按数字顺序对文件进行排序

按数字顺序对文件进行排序

我有多个按 1 到 246 排序的 tiff 图像。我使用 imagemagick 将它们转换为 PDF 文件convert *.tif out.pdf。但是,pdf 文件内的页面顺序不同;(例如,第 2 页是图像 10,依此类推)。当我运行dir或时,ls我得到如下无序文件:

21/06/2018  16:15    <DIR>          .
21/06/2018  16:15    <DIR>          ..
21/06/2018  15:51             2.056 1.tif
21/06/2018  15:51            98.710 10.tif
21/06/2018  15:51            96.492 100.tif
21/06/2018  15:51            44.064 101.tif
21/06/2018  15:51            70.960 102.tif
21/06/2018  15:51            85.254 103.tif
21/06/2018  15:51            92.750 104.tif
21/06/2018  15:51            87.672 105.tif
21/06/2018  15:51            90.284 106.tif
21/06/2018  15:51            79.532 107.tif
21/06/2018  15:51            85.956 108.tif
21/06/2018  15:51            22.452 109.tif
21/06/2018  15:51            91.796 11.tif
(...)

我想要的是:

21/06/2018  16:15    <DIR>          .
21/06/2018  16:15    <DIR>          ..
21/06/2018  15:51             2.056 1.tif
21/06/2018  15:51            98.710 2.tif
21/06/2018  15:51            96.492 3.tif
21/06/2018  15:51            44.064 4.tif
21/06/2018  15:51            70.960 5.tif
21/06/2018  15:51            85.254 6.tif
21/06/2018  15:51            92.750 7.tif
21/06/2018  15:51            87.672 8.tif
21/06/2018  15:51            90.284 9.tif
21/06/2018  15:51            98.710 10.tif
21/06/2018  15:51            91.796 11.tif
(...)

我如何按数字顺序对文件进行排序?

答案1

使用以下批处理文件将文件重命名为 3 位数字名称。然后,您可以使用 Windows 的默认排序顺序来使您的 PDF 文件正确。

@echo off
setlocal enableextensions enabledelayedexpansion
for %%f in (*.tif) do (
    set FileName=%%~nf
    set FileName=00!FileName!
    set FileName=!FileName:~-3!
    set FileName=!FileName!%%~xf
    ren "%%f" "!FileName!"
)

执行上述批处理文件时,文件名将更改为001.tif, 002.tif, 020.tif... etcimagemagick将使用默认排序顺序并生成正确的 PDF。

答案2

你喜欢某些 powershell 吗?例如:

$D = get-childitem
$B = foreach ($F in $D) {
  "{0,30}" -f  $F.Name
}
$B | sort

生产:

PS C:\temp\test> c:\temp\numdir.ps1
                     1.txt
                     2.txt
                    10.txt
                   100.txt

答案3

以下是整整八行 Python 代码,无需任何特定于操作系统的脚本即可完成此操作。我已将其设置为允许使用文件前缀(在您的情况下没有文件前缀,因此第 3 行是 '')。将其变成更花哨的命令行工具可能会很有趣,但上面相同平台特定解决方案的基本逻辑核心在这里更容易看到:

import os
ld = os.listdir()
i  = len('')     # if files have a prefix, set it here
m  = len(max(ld,key = len))
for f in ld:
    d = m - len(f)
    if d > 0:
         os.rename(f,f[:i] + "00000"[:d] + f[i:])

其中 ld = 列出目录;i = 任何零的插入点,由命名前缀的长度决定(在没有前缀的情况下它是 0,但 len('test') 对于 'test1.tif' 到 'test123.tif' 将使插入点为 4);m = 目录中最长文件名的长度;d = 最长文件名与当前正在检查的文件的长度差。希望这对您有所帮助。

答案4

我还发现,这种 printf() 样式的转义将导致 ImageMagick 连续创建输出文件填充零--并且您可以使用这个擒纵机构做其他有用的事情。

magick input*.png -resize 50% output%03d.png

上面的代码应该会根据输入文件系列创建 output001.png、output002.png 等,但请注意,这大概是按照操作系统遇到文件的顺序进行的。我还没有弄乱它。

资料来源:

https://www.imagemagick.org/discourse-server/viewtopic.php?t=32626

`magick` 可以将输出文件重命名为与输入文件相同的文件并附加编号吗?

相关内容