Shell 将照片移动到日期为 YYYYMMDD 的文件夹中的脚本
Shell Script to move photos into folders with date YYYYMMDD
我有一个网络摄像头,每分钟向 PC 上的文件夹发送一张照片 (Linux)
与(mv *20150501* 20150501)
.
相机发送以下文件名的地方:
Schedule_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
子文件夹:snap/(日期+%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
有什么想法吗?
这是一个可以帮助您的示例:
shopt -s nullglob
for f in Schedule*.jpg
do
dir_date=`echo "$f"|sed -e 's/Schedule_\([0-9]\{8\}\)-.*//'`
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
可确保如果目录已存在则不会打印错误,因此无需单独检查它。
此解决方案将自动选择第一个日期并将所有图像移动到一起,然后使用 mencoder 处理它们。
该解决方案有几个应该很容易实现的假设:
- 如果文件夹存在,则它是完整的(填充了所有图片并包含视频)
- 如果文件夹已完成,基本文件夹中将不再有此文件夹的图像
- 基础文件夹中的所有图片均未处理(未处理同一天的其他图片)
- 今天的文件夹不要动,因为它可能还不完整(不是所有图片都完成)
基于这些假设,该解决方案非常有效,因为它同时移动了一天中的所有图片。
我包括了 2 种方法来搜索最早开始的一天。如果您每天生成大量文件,查看目录可能会更快。如果您有多年的目录(因此,数万个目录),查看剩余图像可能会更快。
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
首先,
谢谢你的每一条评论!!!
REGEX 对我来说太难了。谢谢你。
经过今天的大量研究,我将很多拼图部件组合在一起。
我得到的是:
唯一的问题是,如果已经有一个文件夹,则由于 while 函数,不会复制相应的文件。但由于脚本在今天前一天停止,这应该不是问题。
然后我又为过去的情况制作了两个脚本我忘记制作电影它会被创建。另一个检查 plex 文件夹中是否已存在 MP4 文件,如果不存在,则将文件复制到那里。
其实我只是为此修改了脚本。
"normal" 工作的脚本:
#!/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 文件复制到 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 "/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
你知道什么是最好的吗???
真的行!!!
我不敢相信我做到了!!!
非常感谢您的帮助!!!
我有一个网络摄像头,每分钟向 PC 上的文件夹发送一张照片 (Linux)
与(mv *20150501* 20150501)
.
相机发送以下文件名的地方: Schedule_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
子文件夹:snap/(日期+%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
有什么想法吗?
这是一个可以帮助您的示例:
shopt -s nullglob
for f in Schedule*.jpg
do
dir_date=`echo "$f"|sed -e 's/Schedule_\([0-9]\{8\}\)-.*//'`
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
可确保如果目录已存在则不会打印错误,因此无需单独检查它。
此解决方案将自动选择第一个日期并将所有图像移动到一起,然后使用 mencoder 处理它们。 该解决方案有几个应该很容易实现的假设:
- 如果文件夹存在,则它是完整的(填充了所有图片并包含视频)
- 如果文件夹已完成,基本文件夹中将不再有此文件夹的图像
- 基础文件夹中的所有图片均未处理(未处理同一天的其他图片)
- 今天的文件夹不要动,因为它可能还不完整(不是所有图片都完成)
基于这些假设,该解决方案非常有效,因为它同时移动了一天中的所有图片。 我包括了 2 种方法来搜索最早开始的一天。如果您每天生成大量文件,查看目录可能会更快。如果您有多年的目录(因此,数万个目录),查看剩余图像可能会更快。
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
首先, 谢谢你的每一条评论!!! REGEX 对我来说太难了。谢谢你。 经过今天的大量研究,我将很多拼图部件组合在一起。 我得到的是: 唯一的问题是,如果已经有一个文件夹,则由于 while 函数,不会复制相应的文件。但由于脚本在今天前一天停止,这应该不是问题。 然后我又为过去的情况制作了两个脚本我忘记制作电影它会被创建。另一个检查 plex 文件夹中是否已存在 MP4 文件,如果不存在,则将文件复制到那里。 其实我只是为此修改了脚本。
"normal" 工作的脚本:
#!/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 文件复制到 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 "/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
你知道什么是最好的吗??? 真的行!!! 我不敢相信我做到了!!!
非常感谢您的帮助!!!