2

多くのフォルダ内の多くのPNGファイルを変換し、切り抜きファイルを個別に処理して、「切り抜き」ファイルだけのサムネイルを100x100ピクセルにする必要があります。

ファイルの命名は次のとおりです。

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

ここ????で、は数字です。

これまでの私のスクリプトは正常に変換を行うように機能していますが、「切り抜き」ファイルに到達したことを検出してからImageMagickを呼び出し、そこから????_crop_th.pngという名前の100x100pxのサムネイルを作成する必要があります。

ワイルドカードで検出する方法がわからないようです????_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%.*}

もう1つの便利なbash機能は再帰的なグロブであるため、ネストされたループや特殊なディレクトリ処理は必要ありません。

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

スクリプトが完全とは言えないことがいくつかあり、いくつかの冗長性もあります。

また、Imagemagickを使用してファイルからサムネイルを生成するスクリプトには何も表示されません*_crop.png。これは理論的にはこの質問の内容です。

私は書き直しに投票します。次のことがあなたの状況に直接当てはまるかどうかはわかりませんが、このテクニックを使用すると、少なくともより優れたシェルスクリプトを作成できるはずです。

#!/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 に答える