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 converttype convert,它比command -v语法更广为人知,但效果相同。
  • declare -a在函数之外声明数组变量时不需要;简单地directories_to_process=( ... )工作。
于 2012-05-30T01:02:33.613 回答