管道命令输出转换?

giw*_*lus 2 zsh pipe imagemagick

我有一个包含格式 file(0).jpg 到 file(100).jpg 的文件的文件夹

我不能在这里直接使用 convert 生成 pdf,因为顺序最终是 0,1,100,2,20,21,...

echo *.jpg(n) 给出正确的文件顺序。

我如何通过管道将其转换为转换?

我试过了 echo *.jpg(n) | convert - out.pdf

Kus*_*nda 6

如果您要执行的命令是

convert 'file(0).jpg' 'file(1).jpg' ...etc... 'file(100).jpg' out.pdf
Run Code Online (Sandbox Code Playgroud)

然后要么使用你的 glob,

convert ./*.jpg(n) out.pdf
Run Code Online (Sandbox Code Playgroud)

或者只包含 0..100 范围内与该模式匹配的文件:

convert 'file('<0-100>').jpg'(n) out.pdf
Run Code Online (Sandbox Code Playgroud)

或者您可以使用大括号扩展:

convert 'file('{0..100}').jpg' out.pdf
Run Code Online (Sandbox Code Playgroud)

但请注意,它不是通配符,字符串file(0).jpg通过对file(100).jpg将传递给不管这些是否是现有的文件或没有的名称转换。与前一个相反,它也会丢失file(012).jpg例如命名的文件。


小智 5

如果你有很多文件,这会导致你遇到操作系统的命令行限制,你应该使用convert@文件名引用”功能:

generate the list of files ... | convert @- out.pdf
Run Code Online (Sandbox Code Playgroud)

*.jpg(n)在不支持glob 的shell 上zsh,您可以使用以下命令以正确的顺序生成文件列表:

echo 'file('?').jpg' 'file('??').jpg' 'file('???').jpg' | convert @- out.pdf
Run Code Online (Sandbox Code Playgroud)

或者使用支持大括号扩展的 shell:

echo 'file('{?,??,???}').jpg' | convert @- out.pdf
Run Code Online (Sandbox Code Playgroud)

与此不同的是,{1..100}它只会匹配存在的文件。由于echo它内置于大多数 shell 中,因此不受操作系统命令行限制,因此这种构造可能会变成有用的 UUoE。