Reputation: 8309
I'm working on a Bash script that will take an array of directories, iterate through it, create a directory named "processed" inside each directory, and run a command on each file within the directory. Here's my code (read the comment in the code to see what I'm stuck on). Any ideas?
#!/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
UPDATE:
Here is the working script:
#!/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
Upvotes: 3
Views: 1334
Reputation: 295353
Add this in the commented-out area:
for infile in "$directory"/*; do
outfile="$directory/processed/${infile##*/}"
convert "$infile" \
-resize '108x108^' \
-gravity center \
-extent 108x108 \
"$outfile"
done
A few other notes:
if [ -d "$directory" ]
, consider putting [[ -d $directory ]] || continue
at the top of the loop to reduce the nesting depth. (Unlike [ ]
, quoting is not needed inside [[ ]]
in this case).[ ! -d "$directory/processed" ]
and using that to decide whether to create the directory, consider unconditionally running mkdir -p "$directory/processed"
, which will simply exit with a successful status if the directory already exists.command -v convert
with type convert
, which is somewhat better known than the command -v
syntax but will have the same effect.declare -a
when declaring an array variable outside of a function; simply directories_to_process=( ... )
will work.Upvotes: 2