Bash:批量调整图像大小

时间:2012-05-30 00:12:04

标签: bash

我正在开发一个Bash脚本,它将获取一系列目录,遍历它,在每个目录中创建一个名为“processed”的目录,并在目录中的每个文件上运行命令。这是我的代码(阅读代码中的注释,看看我坚持了什么)。有什么想法吗?

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

1 个答案:

答案 0 :(得分: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=( ... )即可。