通过bash脚本使用ImageMagick处理图像

时间:2018-02-23 09:59:22

标签: bash imagemagick

我有一个图像文件夹。我想迭代文件夹,将相同的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脚本,但是变量处理有一些奇怪,这个双脚本方法让我得到了我需要的东西......但我怀疑有一种更简单/更简单的方式甚至可能一线解决方案。

3 个答案:

答案 0 :(得分:0)

检查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 ...是你的命令,有两个输入。

答案 1 :(得分:0)

足以改变你的第一个脚本,不只是回显命令,而是执行它们。

#!/bin/bash

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

答案 2 :(得分:0)

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

#!/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")" 

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