我在一个 Mac 文件夹中存储了近 1,000,000 个 .mp4 安全视频,需要按创建日期将其移动到名为“的单独文件夹中”安全视频 MM-DD-YY”。
因此,例如,创建日期为 2021 年 2 月 1 日的所有文件都将进入一个名为“的新创建的文件夹”安全视频 02-01-21“, ETC。
在该过程结束时,我预计在这个原始文件夹中只会看到几百个带日期的文件夹,而数百万个视频文件根据日期分布到更合理的组中。
我原本打算使用 Applescript 来完成此操作,但正如您可能想象的那样,它超时了并且基本上阻塞了整个笔记本电脑。有人告诉我从终端运行 bash 脚本就可以解决这个问题,但我完全不熟悉如何编写它。
答案1
循环您的文件并找出最后修改日期,例如使用date -r
.然后创建目标目录并将文件移动到那里。
cd /path/to/mp4-files/
for f in *.mp4; do
date=$(date +%F -r "$f")
y=${date:0:4}
m=${date:5:2}
d=${date:8:2}
target="Security Videos $y/Security Videos $y-$m/Security Videos $y-$m-$d"
mkdir -p "$target"
mv "$f" "$target"
done
苹果机版本:
cd /path/to/mp4-files/
for f in *.mp4; do
date=$(stat -f %Sm -t %Y-%m-%d "$f")
y=${date:0:4}
m=${date:5:2}
d=${date:8:2}
target="Security Videos $y/Security Videos $y-$m/Security Videos $y-$m-$d"
mkdir -p "$target"
mv "$f" "$target"
done
答案2
对于如此多的文件,find | xargs
要使用的模式是:
find . -type f -name \*.mp4 -print0 \
| xargs -0 bash -c '
pattern="([0-9]{4})/([0-9]{2})/([0-9]{2}) [|] (.*)"
for file; do
[[ $file =~ $pattern ]] || continue
year=${BASH_REMATCH[1]}
mon=${BASH_REMATCH[2]}
day=${BASH_REMATCH[3]}
dir="Security Videos $year-$mon-$day"
mkdir -p "$dir"
mv -v "$file" "$dir/${BASH_REMATCH[4]}"
done
' sh
bash 使用尾随的“sh”作为 $0,循环for file
遍历 $1、$2、...
答案3
下面将使用“ExifTool”完成您所请求的大部分操作。可以从以下位置下载https://exiftool.org/或者在 Mac 上使用自制软件安装:brew install exiftool
. ExifTool 读取嵌入数字图像中的 EXIF 元数据“可交换图像文件格式”,并可以使用该信息重命名文件、创建目录并将图像移动到那里。网站和手册页中有大量文档和示例用法。
打开终端并在 mp4 所在的目录中运行以下命令:
exiftool -d %Y%m%d-%H%M%S.%%e '-Filename<'CreateDate' *mp4
这会将文件重命名为 20191214-165635.mp4 等形式
然后执行
exiftool -r -d %Y/%m/%d '-directory<$CreateDate/%d' .
这将创建一个目录结构,例如:“2021/02/05/”
并根据日期将每个 mp4 放入其文件夹中。
请注意,使用的日期来自文件中嵌入的元数据,而不是ls
MacOS Finder 显示的日期。如果您进行了任何图像处理或某些其他文件操作,则后者日期将反映这些操作而不是图像的创建日期。我认为正确的创建日期对于安全视频来说很重要。
EXIF 标签因相机型号而异。您的可能有“原始日期/时间”而不是“创建日期”之类的内容。如果是这样,请将上述命令中的“CreateDate”替换为相机中的相应标签,不带任何空格或反斜杠。要查看 EXIF 数据,请执行exiftool example_filename.mp4
.这将转储所有 EXIF 标签。要仅查看带有日期的内容,请执行
exiftool example_file.mp4 | grep -i date
.
处理一百万个文件需要很长时间,具体取决于文件的大小。以下脚本将随机选择 500 个文件子集并将它们放入子目录“tmp”中。在 mp4 所在的目录中创建它,使其可执行chmod u+x select_files.sh
并运行它:./select_files.sh
。移至目录 ( cd tmp
) 并运行上述 exiftool 命令以确认它们是否执行您想要的操作。
#!/bin/bash
#
# select_files.sh - Copy a random selection of files to subdirecotry 'tmp'
#
ext="mp4" # File extension
num=500 # Number of files to select
ls *.${ext} | sort -R | head -n $num > random_files.txt
mkdir tmp
while read -r file ; do
cp $file ./tmp
done < random_files.txt
# End