我正在开发一个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
答案 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=( ... )
即可。