何百万ものファイルを廃止予定のフォルダに移動する

何百万ものファイルを廃止予定のフォルダに移動する

Macフォルダには約1,000,000の.mp4セキュリティビデオが保存されており、作成日ごとに次のような別のフォルダに移動する必要があります。セキュアビデオMM-DD-YY」。

たとえば、作成日が2021年2月1日のすべてのファイルは、新しく作成されたフォルダです安全ビデオ02-01-21「、など。

プロセスが終了すると、この生フォルダには日付付きフォルダが数百個しか表示されず、数百万のビデオファイルが日付に基づいてより合理的なグループとして配布されることが予想されます。

もともと私は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

Macバージョン:

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/またはhomebrewを使用してMacにインストールしますbrew install exiftool。 ExifToolは、デジタル画像に含まれているEXIFメタデータ「交換可能な画像ファイル形式」を読み、その情報を使用してファイル名を変更し、ディレクトリを作成し、画像を移動できます。 Webサイトとマニュアルページには、広範な文書と使用法の例があります。

ターミナルを開き、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

関連情報