将照片移动到日期为YYYYMMDD的文件夹的Shell脚本

zd287kbt  于 2023-05-29  发布在  Shell
关注(0)|答案(4)|浏览(373)

我有一个IP摄像头,每分钟发送一张照片到PC(Linux)上带有(mv *20150501* 20150501)的文件夹。
其中摄像机发送以下文件名:
时间表_20150501-103642.jpg

我想做一个shell脚本:

  • 查看YYYYMMDD格式的日期文件名。如果该编号不存在,请创建一个具有该编号的文件夹,并将包含该编号的所有文件移动到此文件夹中。
  • 检查每个文件夹中是否有.MP4文件。如果没有,执行此脚本,从图像中生成延时视频:
mencoder "mf://*.jpg" -mf fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell:vbitrate=7000 -oac copy -o Zeitraffer`**20150501**.mp4

基本文件夹为:
子文件夹:snap/(date +%YYYY%mm%dd)
到目前为止,我都是使用mv单独手动完成所有这些工作。然后,我进入文件夹,修改脚本的时间推移。:—(
到目前为止,我有一个脚本来按日期至少制作大量文件夹:

#!/bin/bash

read -p "Geben Sie den ersten Ordner an (JJJJMMTT): " now  
read -p "Geben Sie den letzten Ordner an (JJJJMMTT): " end  

while [ "$now" != "$end" ] ;
do
now=`date +"%Y%m%d" -d "$now +1 day"`;
mkdir $now
done

你知道吗?

mkshixfv

mkshixfv1#

首先,感谢您的每一条评论!!!Regex对我来说太难了。谢谢alyway。经过大量的研究,今天我把很多拼图部分组合在一起。我得到的是:唯一的问题是,如果已经有一个文件夹,则由于while函数,相应的文件不会被复制。但由于脚本在今天前一天停止,这应该不是问题。然后我又为这个案子做了两个剧本,过去我忘了做一部电影,就这样创作出来了。另一个检查MP4文件是否已经存在于plex文件夹中,如果不存在,则将文件复制到那里。实际上,我只是修改了剧本。
“正常”工作的脚本:

#!/bin/bash
read -p "Geben Sie den ersten Ordner an (JJJJMMTT): " begin  
end=$(date +%Y%m%d -d "-1 day")                                       
 while [ $begin != $end ] 
do
begin=`date +"%Y%m%d" -d "$begin +1 day"`
if [ ! -d $begin ]  # Prüfen, ob es den Ordner gibt.                                      
then
    /bin/mkdir $begin 
    echo "Ordner $begin erstellt"
    mv *$begin*.jpg $begin  
echo "Bilder vom $begin verschoben nach $begin"
 cd $begin  
 $(mencoder mf://*.jpg -mf fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell:vbitrate=7000 -oac copy -o Zeitraffer$begin.mp4)
  cp Zeitraffer$begin.mp4 /Plexfolder/ 
 echo "Kopiere Zeitraffer$begin.mp4 nach /RAID5/filme/Kamera/"
 cd ..
 fi
 done

检查MP4文件是否存在的脚本(如果不存在)将创建它并复制到plex文件夹:

#!/bin/bash

  read -p "Geben Sie den ersten Ordner an (JJJJMMTT): " begin  
  end=$(date +%Y%m%d -d "-1 day")       
  while [ $begin != $end ] 
  do
  begin=`date +"%Y%m%d" -d "$begin +1 day"`
  if [ -d $begin ] 
  then
  cd $begin 
  if [ ! -f Zeitraffer$begin.mp4 ] #Prüfen, ob es eine MP4 Datei gibt 
  then
  $(mencoder mf://*.jpg -mf fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell:vbitrate=7000 -oac copy -o Zeitraffer$begin.mp4)
  cp Zeitraffer$begin.mp4 /plexfolder/ 
  echo "Kopiere Zeitraffer$begin.mp4 nach /plexfolder/"
  fi  
  cd ..
  fi
  done

和一个复制丢失的MP4文件到丛文件夹:

#!/bin/bash
read -p "Geben Sie den ersten Ordner an (JJJJMMTT): " begin  
end=$(date +%Y%m%d -d "-1 day") 
while [ $begin != $end ] 
do
begin=`date +"%Y%m%d" -d "$begin +1 day"`
if [ -d $begin ]          
then
cd $begin 
if [ ! -f "/plexfolder/Zeitraffer$begin.mp4" ] 
then
cp Zeitraffer$begin.mp4 /RAID5/filme/Kamera/
echo "Kopiere Zeitraffer$begin.mp4 nach /RAID5/filme/Kamera/"
fi  
cd ..
fi
done

你知道最棒的是什么吗它真的很有效!我真不敢相信我做到了!!!
非常感谢你的帮助!!!

mf98qq94

mf98qq942#

下面是一个可以帮助您的示例:

shopt -s nullglob

for f in Schedule*.jpg
do
    dir_date=`echo "$f"|sed -e 's/Schedule_\([0-9]\{8\}\)-.*/\1/'`
    mkdir -p "$dir_date"
    mv "$f" "$dir_date"
done

for d in 20*
do
    if [[ -d "$d" ]]
    then
        cd "$d"
        if [[ ! -f Zeitraffer"$d".mp4 ]]
        then
            # Run mencoder here 
        fi
        cd ..
    fi
done

使用的是Nullglob,所以如果没有匹配的文件,for将不会按照字面意思使用Schedule*.jpg模式。然后用sed提取日期部分。将-p添加到mkdir可以确保如果目录已经存在,它不会打印错误,因此不需要单独检查它。

xqk2d5yq

xqk2d5yq3#

该解决方案将自动选择第一个日期,并将所有图像移动到一起,然后使用mencoder处理它们。该解决方案有几个假设,应该很容易实现:

  • 如果文件夹存在,它是完整的(填充所有图片并包含视频)
  • 如果文件夹已完成,则基本文件夹中不再保留此文件夹的图像
  • 基本文件夹中的所有图像尚未处理(同一天的其他图像尚未处理)
  • 今天的文件夹不应该被触摸,因为它可能仍然是不完整的(不是所有的图片完成)

基于这些假设,该解决方案非常有效,因为它同时移动一天的所有图片。我包括了两种方法来搜索最早开始的一天。如果你每天产生大量的文件,查看目录可能会更快。如果你有很多年的目录(所以,成千上万的目录),它可能会更快地看看剩余的图像。

today=$(date +"%Y%m%d" -d "now")

#first day to process based on existing images
day=$(ls Schedule_* | grep -o "[[:digit:]]\{8\}" | uniq | sort | tail -n1)

# first day to process based on existing folders (might be faster)
#day=$(find . -type d -regex "./[0-9]+" -printf '%P\n' | sort | tail -n1)

# initial increment of day
day=$(date +"%Y%m%d" -d "$day +1 day")

while [ $day -lt $today ] ; do
  mkdir $day
  mv Schedule_${day}-*.jpg ${day}/. 2>/dev/null
  cd $day
    # run mencoder
  cd ..
  day=$(date +"%Y%m%d" -d "$day +1 day")
done
liwlm1x9

liwlm1x94#

以下是我使用的一个解决方案,用于根据创建日期对图像和视频进行排序,基于ExifTool

#!/bin/bash

# Based on EXIF metadata, gets the date and time a file was created
get_date_and_time() {

  local result;

  result=$(exiftool -binary -DateTimeOriginal "$1")

  # If the file metadata doesn't contain DateTimeOriginal try with another tag
  if [ -z "$result" ]; then
    result=$(exiftool -binary -CreateDate "$1")
  fi

  # https://www.shellcheck.net/wiki/SC2059
  printf "%s" "$result"
}

main() {

  # When the script's called without arguments, sort
  # files found in the current directory
  if (( $# != 1 )); then
    dir_with_files="."
  # Otherwise, use the first argument as the directory
  else
    dir_with_files="$1"
  fi

  echo "moving files in \"$dir_with_files\""

  for f in "$dir_with_files"/*
  do
    if [ -f "$f" ]; then
      date_time=$(get_date_and_time "$f")
      if [ -n "$date_time" ]; then
        # Remove the time and keep the date by removing
        # everything after the first space
        date="${date_time%% *}"

        # Remove all colons with dashes in the date
        dir_name="${date//:/-}"
        # Create the directory if it doesn't exist yet
        if [ ! -d "$dir_with_files/$dir_name" ]; then
          mkdir --verbose "$dir_with_files/$dir_name"
        fi

        mv --no-clobber --verbose "$f" "$dir_with_files/$dir_name"

      else
        echo "No date for $f"
      fi
    fi
  done

}

main "$@"

如果你把这段代码放在sort_by_day.sh中,并让它可以用chmod +x sort_by_day.sh执行,你可以这样调用它:

  • ./sort_by_day.sh对当前目录中的文件进行排序。
  • ./sort_by_day.sh my_imagesmy_images目录中的文件进行排序。

基于EXIF标记DateTimeOriginal或-如果文件没有该标记-CreateDate,脚本将创建类似2023-05-23的目录,并将当天创建的文件移动到相应的目录中。
如果文件没有这些EXIF标记,脚本不会移动它。
我已经用它来排序JPG和MOV。

相关问题