将数百万个文件移动到过时的文件夹中

将数百万个文件移动到过时的文件夹中

我在一个 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 放入其文件夹中。

请注意,使用的日期来自文件中嵌入的元数据,而不是lsMacOS 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

相关内容