旋转奇数图片

旋转奇数图片

我写了一个小脚本来旋转目录中所有奇数图片,但我无法让它工作。这是代码。

#!/bin/bash

count=1

for picture in `ls -v *.png`
do
    if ["$picture" == "picture_$count.png"]
    then
        mogrify -rotate 90 "$picture"
        count=$(($count+2))
    fi
done

有什么建议么?

答案1

不要解析ls

相反,只需让 shell 帮你抓取所有奇数文件即可。这样既安全又简单:

#!/bin/bash

for picture in *[13579].png
do
    mogrify -rotate 90 "$picture"
done

[]在 shell 中,glob 匹配其中的任意一个字符,因此通过列出所有奇数,完整的模式匹配当前目录中以 结尾的任何文件奇数.png。无需维护运行计数,而且由于文件名扩展(即 shell 通配符)是命令行执行前发生的最后一件事,因此它不会被带有奇怪字符的文件名所绊倒。


至于你原来的剧本具体有什么问题,空终止字符串指出,您需要在行中的[和周围添加空格。这是因为不是 的特殊语法,它只是另一个命令:,它是 的同义词]if[if/bin/[test命令。(出于性能原因,您的 shell 可能提供了自己的内置版本[,但它的行为仍应与外部命令相同,包括所有解析限制。)

[如果在和之间没有空格"$picture",则表示bash运行一个名为 的命令,其中包含[picture_1.png两个参数:==picture_1.png]。由于你大概[picture_1.png您的计算机上没有调用的命令,您的脚本失败。

[如果在和周围有空格],则您将[使用四个参数运行该命令:picture_1.png==picture_1.png]

答案2

[您的脚本无法正常工作,因为在第 7 行中, 之后和 之前都需要一个空格]
例如:

if [ "$picture" == "picture_$count.png" ]

此外,只要没有遗漏奇数,您当前的脚本就会起作用。

答案3

max=$(ls *.png | sort -n | tail  -1 | xargs basename -s .png)
for f in seq 1 2 $max
do
    mogrify -rotate 90 $f.png
done

答案4

最后我发现了脚本中的错误:

  • 首先是注释[前后的空格]这里这里。
  • 其次,感谢我的问题MariusMatutiae 和 Moses,我将第七行从 改为if ["$picture" == "picture_$count.png"]if [ $picture == pagina_$count.png ]删除"

这是最终的脚本。

#!/bin/bash

count=1

for picture in `ls -v *.png`
do
    if [ $picture == picture_$count.png ]
    then
        mogrify -rotate 90 "$picture"
        count=$(($count+2))
    fi
done

相关内容