1

画像をバッチサイズ変更するスクリプトを書いています。もともとは操作を適用していたのfor file in $(ls $1)ですが、グロブを使えるようにしたいと思っているので、もっと似たようなものを探していfor file in $(echo $1)ます。問題は、dotglobが有効になっている場合と有効になっていない場合があるため、echo *隠しファイル(特に、.DS_Store)が返されconvert、エラーが発生してスクリプトが停止する可能性があることです。コマンドのデフォルトの動作は、cd画像でいっぱいのディレクトリに移動して実行すると、 dotglobが有効になっているかどうかに関係なく、隠しファイルを除くresize * 400x400 jpgすべての画像のサイズが変更されるようにしたいと思います。

だから、擬似コードで、私は探しています:

for file in $(echo $1 | [filter-hidden-files])

これが古い振る舞いの私のスクリプトです。解決策が見つかったら、新しい動作で更新されます:

# !/bin/bash

# resize [folder] [sizeXxsizeY] [outputformat]
# if [outputformat] is omitted, the input file format is assumed

for file in $(ls $1)
do
    IMGNAME=$(echo "$file" | cut -d'.' -f1)
    if test -z $3
    then
        EXTENSION=$(echo "$file" | cut -d'.' -f2)
        convert $1/$file -resize $2 -quality 100 $1/$IMGNAME-$2.$EXTENSION
        echo "$file => $IMGNAME-$2.$EXTENSION"
    else 
        convert $1/$file -resize $2 -quality 100 $1/$IMGNAME-$2.$3
        echo "$file => $IMGNAME-$2.$3"
    fi
done

現在のスクリプトは次のとおりです。

# !/bin/bash

# resize [pattern] [sizeXxsizeY] [outputformat]
# if [outputformat] is omitted, the input file format is assumed

for file in $(echo $1)
do
        IMGNAME=$(echo "$file" | cut -d'.' -f1)
        if test -z $3 && if test -f $3
        then
            EXTENSION=$(echo "$file" | cut -d'.' -f2)
            convert $file -resize $2 -quality 100 $IMGNAME-$2.$EXTENSION
            echo "$file => $IMGNAME-$2.$EXTENSION"
        else 
            convert $file -resize $2 -quality 100 $IMGNAME-$2.$3
            echo "$file => $IMGNAME-$2.$3"
        fi
done

コマンドresize * 400x400を指定すると、convertは.DS_Store(OSXシステム上のすべてのファイルに存在する隠しファイル)を処理できないため、エラーをスローします。非表示の画像を処理することは決してないので、自動的にフィルタリングしたいと思います。私はgrepまたはfindを使用してこれを実行しようとしていますが、まだ理解していません。

新しいスクリプトはここにあります:

for file in $(echo $1)
do
4

4 に答える 4

3

resize * 400x400スクリプトのコマンドラインをからに変更することをお勧めします。スクリプトはresize 400x400 *、そのように標準のUNIXツール(、、、grepなど)sedに似ていlnます。スクリプトでdotglobオプションの設定を解除する必要はありません(隠しファイルをグロブするかどうかはスクリプトのユーザー次第なので、これはより良い方法です)。

スクリプトは次のようになります。

#!/bin/bash

OUTPUTFORMAT=$1
# Remove original $1 from the list of arguments
shift

for i in "$@"
do
    # Use $OUTPUTFORMAT here
    etc....

スクリプトのコマンドラインを変更したくない場合。設定してみてくださいGLOBIGNORE

export GLOBIGNORE=".*"

または、extglobが設定されている場合は、次のようにファイルグロブを試すことができます。

echo !(.*)
于 2009-11-16T09:01:50.877 に答える
1

グロビング時にdotglobで始まるファイルを含めるかどうかを決定するシェル オプションがあります。.これが当てはまるかどうかを確認できます

shopt dotglob

スクリプトで明示的に無効にすることもできます。

#!/bin/bash

shopt -u dotglob

for file in $1/*; do
  ...
done
于 2009-11-16T08:10:02.543 に答える
1

$* でファイルのリストを取得しているので、それらを1つずつ確認できます

for i in $*
do 
   expr $i : '^\..*' > /dev/null && continue
   # process file
done
于 2009-11-16T08:14:40.153 に答える
1

for ループで ls を使用する必要はありません。ほとんどの場合、役に立ちません。また、* を使用した for ループは、特に指定しない限り、隠しファイルを返しません。隠しファイルを表示するには、

for files in .*
do
 echo $files
done
于 2009-11-16T08:15:04.700 に答える