我正在制作一个Bash脚本,将在不同时间和日期(不是每天都有照片)进入文件夹的照片排序如下。照片必须移动到一个名为PhotosOrder的文件夹中,其中每天都有一个带有日期的文件夹。该任务在synology服务器上执行,然后与同步到windows服务器的内容同步。首先,我必须说我概括了它,因为我必须在许多不同的文件夹中执行它,并且我为每个文件夹复制了脚本。这当然是可优化的,但我们会在它工作后得到它。脚本必须检查是否存在jpg文件,并将它们列在辅助变量arr中。检查该列表在if中是否为空,如果为空则不执行任何操作,但如果存在jpg文件则生成:
创建当天的文件夹。它计算照片的数量,因为在不同的时间,不同的人放照片,我想避免没有被覆盖。
它移动照片,重新命名他们考虑到前面的数字和我在开始时设置的名称参数。我不得不说,之后我不能删除空文件夹,因为如果我不删除synthing稍后用于同步的文件夹(我会将该文件夹与另一台服务器上的文件夹同步)。到目前为止,另一种脚本为我工作,每天创建一个文件夹,无论是否有照片和移动它们(如果有的话),但然后我必须手动删除空文件夹。如果我告诉脚本删除那些空文件夹,然后它删除文件夹,syncthing使用,它不同步与其他服务器了(除此之外,我不认为这是最佳的)。因此,在执行任何操作之前,使用if循环检查是否有照片。
我现在的脚本是这个:
这个:
#!/bin/sh
#values that change from each other
FOLDER="/volume1/obraxx/jpg/"
OBRA="-obraxx-"
#Create jpg listing in variable arr:
arr=$$(ls -1 /volume1/obraxx/jpg/*.jpg 2>/dev/null)
#if the variable is not empty, the if is executed:
if [[ !(-z $arr) ]]; then.
#Create the folder of the day
d="$(date +"%Y-%m-%d")"
mkdir -p "$FOLDER"/PhotosOrdered/"$d"
DESTINATION="$FOLDER/PhotosOrder/$d/"
#Count existing photos:
a=$$(ls -1 $FOLDER | wc -l)
#Move and rename the photos to the destination folder.
for image in $arr; do
NEW="$PICTURE$a"
mv -n $image $DESTINATION$(date +"%Y%m%d")$NEW.jpg
let a++
done
fi
- shebang线应该是
#!/bin/bash
,而不是#!/bin/sh
。 - 你的数组使用有语法问题。
- 不应该解析
ls
的输出 - 您正在计算源文件夹中的现有照片。应该是
- 将当前日期放在文件夹名称和文件中文件名。(我不知道这是否是要求)
- 定义了变量
OBRA
但没有使用。 - 没有定义变量
PICTURE
- 不建议用户变量使用大写,因为它们可能与系统变量冲突。
那么请尝试以下操作:
#!/bin/bash
prefix="picture" # new file name before the number
src="/volume1/obraxx/jpg/" # source directory
# array "ary" is assigned to the list of jpg files in the source directory
mapfile -d "" -t ary < <(find "$src" -maxdepth 1 -type f -name "*.jpg" -print0)
(( ${#ary[@]} == 0 )) && exit # if the list is empty, do nothing
# first detect the maximum file number in the destination directory
d=$(date +%Y-%m-%d)
dest="$src/PhotosOrder/$d/" # destination directory
mkdir -p "$dest"
for f in "$dest"*.jpg; do
if [[ -f $f ]]; then # check if the file exists
n=${f//*$prefix/} # remove substings before prefix inclusive
n=${n%.jpg} # remove suffix leaving a file number
if (( n > max )); then
max=$n
fi
fi
done
a=$(( max + 1 )) # starting (non-overwriting) number in the destination
# move jpg files renaming
for f in "${ary[@]}"; do
new="$prefix$a.jpg"
mv -n -- "$f" "$dest$new"
(( a++ )) # increment the file number
done