3

ディレクトリの配列を取得し、それを反復処理し、各ディレクトリ内に「処理済み」という名前のディレクトリを作成し、ディレクトリ内の各ファイルに対してコマンドを実行する Bash スクリプトに取り組んでいます。これが私のコードです(コード内のコメントを読んで、何が詰まっているかを確認してください)。何か案は?

#!/bin/bash

command -v convert >/dev/null 2>&1 || {
    echo >&2 "Convert is not installed. Aborting.";
    exit 1;
}

declare -a directories_to_process=(
    "$HOME/Desktop/Album 1"
    "$HOME/Desktop/Album 2"
    "$HOME/Desktop/Album 3"
);

for directory in "${directories_to_process[@]}"
do
    if [ -d "$directory" ]; then
        if [ ! -d "$directory/processed" ]; then
            mkdir "$directory/processed"
        fi

        # Insert code to run the following command on each file in $directory:
        #
        # convert $directory/$filename -resize 108x108^ -gravity center -extent 108x108 $directory/processed/$filename
    fi
done

アップデート:

作業スクリプトは次のとおりです。

#!/bin/bash

command -v convert >/dev/null 2>&1 || {
    echo >&2 "Convert is not installed. Aborting.";
    exit 1;
}

directories_to_process=(
    "$HOME/Desktop/Album 1"
    "$HOME/Desktop/Album 2"
    "$HOME/Desktop/Album 3"
);

for directory in "${directories_to_process[@]}"
do
    [[ -d $directory ]] || continue

    mkdir -p "$directory/processed"

    for infile in "$directory"/*.jpg
    do
        outfile="$directory/processed/${infile##*/}"
        convert "$infile" \
                -resize '108x108^' \
                -gravity center \
                -extent 108x108 \
                "$outfile"
    done
done
4

1 に答える 1

2

コメントアウトされた領域にこれを追加します。

for infile in "$directory"/*; do
  outfile="$directory/processed/${infile##*/}"
  convert "$infile" \
      -resize '108x108^' \
      -gravity center \
      -extent 108x108 \
      "$outfile"
done

その他の注意事項:

  • 内に大量のロジックをネストする代わりに、ループの先頭に配置してネストの深さを減らすことをif [ -d "$directory" ]検討してください。[[ -d $directory ]] || continue( とは異なり[ ]、この場合、引用符は必要ありません[[ ]])。
  • それをテスト[ ! -d "$directory/processed" ]して使用してディレクトリを作成するかどうかを決定する代わりに、無条件に実行することを検討mkdir -p "$directory/processed"してください。ディレクトリが既に存在する場合、成功ステータスで終了します。
  • に置き換えることcommand -v convertを検討してくださいtype convert。これは、構文よりも多少よく知られていcommand -vますが、同じ効果があります。
  • declare -a関数の外で配列変数を宣言するときは必要ありません。単にdirectories_to_process=( ... )動作します。
于 2012-05-30T01:02:33.613 に答える