Bash:批量调整图像大小

Bash:批量调整图像大小,bash,Bash,我正在编写一个Bash脚本,它将获取一个目录数组,遍历它,在每个目录中创建一个名为“processed”的目录,并对目录中的每个文件运行一个命令。这是我的代码(请阅读代码中的注释以了解我的错误)。有什么想法吗 #!/bin/bash command -v convert >/dev/null 2>&1 || { echo >&2 "Convert is not installed. Aborting."; exit 1; } declare

我正在编写一个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

将其添加到已注释区域:

for infile in "$directory"/*; do
  outfile="$directory/processed/${infile##*/}"
  convert "$infile" \
      -resize '108x108^' \
      -gravity center \
      -extent 108x108 \
      "$outfile"
done
其他一些注意事项:

    [-LI]而不是在代码中嵌套大量的逻辑。如果[-D“$Directory”] < /代码>,考虑把<代码> [[-D$Directory ] ]继续在循环的顶部/<代码>以减少嵌套深度。(与
    []
    不同,在这种情况下,
    [[]]
    中不需要引用) 而不是测试<代码> [$-Directory /处理] [/COD] >并使用它来决定是否创建目录,考虑无条件运行<代码> MKDIr -p“$Directory /处理”< /C> >,如果目录已经存在,它将以成功的状态退出。
  • 考虑将
    command-v convert
    替换为
    type convert
    ,这比
    command-v
    语法更为人所知,但具有相同的效果
  • 在函数外部声明数组变量时,不需要
    declare-a
    ;只需
    目录到进程=(…)
    即可

引用整个glob是行不通的。将“$directory”/*中的填充更改为
;做
@DennisWilliamson呃——我知道得更清楚。谢谢你的接球。@charlesduff真管用!非常感谢您不仅回答了我的问题,而且提供了改进建议。你真棒!关于我使用的最后一个脚本,请参见我的问题。我坚持使用
command-v
,因为根据POSIX很好地定义了
command
的退出状态,因此使用它可能是最安全的。注意:如果您将其作为独立脚本使用,请记住首先创建
processed
,否则会出现无用的错误。