【问题标题】:Processing images using ImageMagick through bash scripts通过 bash 脚本使用 ImageMagick 处理图像
【发布时间】:2018-02-23 09:59:21
【问题描述】:

我有一个图片文件夹。我想遍历文件夹,对每个文件应用相同的 ImageMagick 转换函数,并将输出保存到单独的文件夹中。

我目前的做法是这样的:

#!/bin/bash

mkdir "Folder2"
for f in Folder1/*.png
do
    echo "convert -brightness-contrast 10x60" "Folder1/$f" "Folder2/"${f%.*}"_suffix.png"
done

然后我将该终端输出复制并粘贴到一个新的 bash 脚本中,最终看起来像这样:

#!/bin/bash

convert -brightness-contrast 10x60 Folder1/file1.png Folder2/file1_suffix.png
convert -brightness-contrast 10x60 Folder1/file2.png Folder2/file2_suffix.png
convert -brightness-contrast 10x60 Folder1/file3.png Folder2/file3_suffix.png

我尝试为这个任务编写一个 bash 脚本,但变量处理有些奇怪,这个两个脚本的方法让我得到了我需要的东西......但我怀疑有一个更简单/更简单的方法,甚至可能单线解决方案。

【问题讨论】:

标签: bash imagemagick


【解决方案1】:

改变你的第一个脚本就足够了,不仅仅是回显命令,而是执行它们。

#!/bin/bash

mkdir "Folder2"
for f in Folder1/*.png
do
    convert -brightness-contrast 10x60 "Folder1/$f" "Folder2/${f%.*}_suffix.png"
done

【讨论】:

  • 哦,天哪...“有些奇怪”是因为这一点中的额外引号:"Folder2/"${f%.*}"_suffix.png"我最初试图让这样的东西工作,但它没有正确显示.对于 bash 脚本的新手来说,这可能是最好的选择。
【解决方案2】:

水晶球告诉我文件名中有空格导致“变量处理有些奇怪”。在这种情况下,您需要空间的解决方法。例如,您可以尝试以下脚本:

#!/bin/bash

hasspaces="^(.+[^\'\"])([ ])(.+)$"

function escapespaces { 
  declare -n name=$1
  while [[ $name =~ $hasspaces ]] ; do
    name=${BASH_REMATCH[1]}'\'${BASH_REMATCH[2]}${BASH_REMATCH[3]}
  echo 'Escaped string: '\'$name\'
  done
}

mkdir Folder2
while read -r entry; do
  echo "File '$entry'"
  escapespaces entry
  echo "File '$entry'"
  tmp=${entry#Folder1}
  eval "convert -brightness-contrast 10x60" "$entry" "Folder2/"${tmp%.*}"_suffix.png"
done <<<"$(eval "ls -1 Folder1/*.png")" 

如果这不起作用,请务必告诉我,以便我可以为我的水晶球申请退款!此外,如果您可以提供有关“变量处理中的怪异”的更多详细信息,我们可以尝试帮助解决这些其他怪异:-)

【讨论】:

  • 不是这个问题,但几乎可以肯定我将来会遇到的问题 - 感谢您抢先回答未来的问题
  • 好了,水晶球要回去了。无论如何,如果我是你,我会尽力解决奇怪的变量处理。
【解决方案3】:

检查this answer(以及问题中的少数人):

您可以在示例中使用它:

find Folder1 -name "*.png" | sed -e 'p;s/Folder1/Folder2/g' -e 's/.png/_suffix.png' | xargs -n2 convert -brightness-contrast 10x60

注意:第一个 sed 中的 p 很重要。

find 将列出Folder1 中名称与 *.png 表达式匹配的所有文件

sed -e 'p;/Folder1/Folder2/g' 将 (a) 打印输入行并 (b) 将 Folder1 替换为 Folder2

-e 's/.png$/_suffix.png'.png 后缀替换为_suffix.png 后缀

xargs -n2 告诉 shell xargs 应该最多接受两个参数(第一个由sed 'p' 打印,第二个通过所有-e

convert ... 是您的命令,接受两个输入。

【讨论】:

  • 非常感谢您提供这一班轮并详细解释了它的工作原理!快速跟进:行尾双引号的目的是什么:10x60"
  • 打错了 :) 不应该有 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
相关资源
最近更新 更多