2

我需要在许多文件夹中转换大量 PNG 文件,并分别处理裁剪文件,以便仅为“裁剪”文件制作 100x100 像素的缩略图。

文件命名为:

????_thumb.png
????_snapshot.png
????_crop.png

哪里????是一个数字。

到目前为止,我的脚本可以很好地进行转换,但是我需要检测何时到达“裁剪”文件,然后调用 ImageMagick 并从中创建一个 100x100px 的缩略图,名为 ????_crop_th.png

我似乎不知道如何检测通配符????_crop.png。

到目前为止我的脚本:

#!/bin/bash

BASE64=/root/scripts/base64
logfile=/root/tester/convert_failed.txt
goodfile=/root/tester/goodfile.txt
proc_dir=/root/tester/testing
temp_file=/root/tester/temp.png
b64=/root/tester/b64.txt

cd $proc_dir
for i in *
 do
  if [ -d $i ]
       then

     for j in $i/*.png
       do
      if [ -f $j ]
        then
        #just get files name without extension
        fname=`echo $j | cut -d'.' -f1` 
        #perform operations
        cp $j ${fname}.b64
        $BASE64/base64 -d $j $temp_file

        if [ $ -eq 0 ]
          then
            cp $temp_file $j
             echo  $j >> $goodfile
             rm -f ${fname}.b64
        fi
      fi
    done
  fi
 done
 `find $proc_dir -name *.b64 -print >$b64`
 sort $logfile -o $logfile
 sort $goodfile -o $goodfile
 sort $b64 -o $b64

任何帮助都将不胜感激。

4

2 回答 2

3

您可以使用正则表达式匹配或尾随子字符串删除,例如:

if [[ "$j" =~ _crop.png$ ]]

或者

if [[ "${j%_crop.png}" != "$j" ]]

另请注意,切断扩展名同样容易:

fname=${j%.*}

另一个有用的 bash 功能是递归通配符,因此您不需要嵌套循环和专门的目录处理:

shopt -s globstar
for j in **/*.png
于 2012-12-11T00:56:27.457 回答
3

您的脚本在某些方面做得不够完美,还有一些冗余。

我也没有在您的脚本中看到任何使用 Imagemagick 从*_crop.png文件生成缩略图的内容,理论上这就是这个问题的意义所在

我投票支持重写。我不知道以下内容是否直接适用于您的情况,但这些技术至少应该让您编写更好的 shell 脚本。

#!/bin/bash

base64=/root/scripts/base64/base64
logfile=/root/tester/convert_failed.log
goodfile=/root/tester/goodfile.txt
proc_dir=/root/tester/testing

# The `cd` command will fail, if it fails.  (Really.)
if cd "$proc_dir"; then

    # Find all the PNGs in all subdirectories one level under our WD
    for file in */*.png; do

        # Do stuff (I have no idea what this is for...)
        if $base64 -d "$file" "${file%.png}".b64 && mv "${file%.png}".b64 "$file"; then
            echo "$file" >> $goodfile
        else
            printf '[%s] FAILED: %s\n' "${date '+%Y-%m-%d %T')" "$file" >> $logfile
        fi

        # Only make thumbnails if we need them
        if [[ $file =~ _crop.png$ ]] && [[ ! -f "${file%_crop.png}_thumb.png" ]]; then
            convert "$file" -scale 100x100 "${file%_crop.png}_thumb.png"
        fi

    done

fi
于 2012-12-11T03:57:22.660 回答