如何检查是否有jpg在一个文件夹,然后按日期排序在其他文件夹中的Bash?



我正在制作一个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

相关内容

  • 没有找到相关文章

最新更新