ファイル名に日付が含まれるファイルをその日付のフォルダにコピーする

ファイル名に日付が含まれるファイルをその日付のフォルダにコピーする

同様の質問を探しましたが、私の場合は明確な答えを得るのは困難でした。

私は Synology DS1515+ と DSM 6.2.2 を使用しています。

まず、以下のスクリプトを使用して日付を含む日次フォルダーを作成しました。

mkdir /volume1/video/$(date +%Y-%m-%d\(%a\))

このスクリプトは毎日深夜に実行されます。そのため、毎深夜にこれらのフォルダーが作成されます。

(つまり、コピー前にコピー先フォルダが常に存在しているということです。)

また、いくつかのビデオ ファイルがダウンロードされます。それらのファイル名には日付が含まれています。

たとえば、ABCDABCD.200328.avi または EFGHIJKH.200327.1080p.mp4

ファイル名には特定のルールはありませんが、YYMMDD 型のような日付がすべてのファイル名に含まれます。

これらのファイルを同じ日付が含まれるフォルダーにコピーしたいと思います。

(上記で説明した通り自動的に作成されるフォルダです)


[ディレクトリの場所]

コピーしたいファイルのパス: /volume1/video/

保存先ディレクトリの例: /volume1/video/daily/2020-04-06(Mon)


どのように行うのか、手助けしたり説明したりしていただけますか?

説明していただく場合は、上記のように私の場合のディレクトリのパスも含めてください。

(私の理解不足のため、お勧めいただいたコードを適用できないため。申し訳ありません)

改めてお礼申し上げます。良い一日をお過ごしください。

答え1

これを試して、

for f in /volume1/video/*; do
  # skip over directories
  [ -f "$f" ] || continue
  # grep the date in YYMMDD format
  date=$(printf '%s' "$f" | grep -Eo '[0-9]{6}')
  # set target path using date to convert YYMMDD to YYYY-MM-DD(%a)
  target="/volume1/video/daily/$(date -d "$date" +%Y-%m-%d\(%a\))/"
  # mv the file
  echo mv "$f" "$target"
done
  • 動作しているときはエコーを削除します。
  • $date空でないかどうかを確認するチェックを追加すると良いかもしれません。
  • ディレクトリが見つからない場合のエラーを回避するには、mkdir -p "$target"の前にを追加できます。mv
  • 注: このコードにはミレニアムバグがあります ;-)

答え2

テストしたスクリプトも作成しました:

#!/bin/bash

SOURCE_FOLDER="video/"
TARGET_FOLDER="video/daily" # Not used as it is under the source folder.

doMove() {
    # Year loop assuming AFTER 2000 up to 2022
    cd "$SOURCE_FOLDER"
    for i in 20{19..20} ; do
        #echo -e "/nWorking on 20$1"
        # Month Loop
        for j in 0{1..9} {10..12} ; do
            # Day Loop
            for k in 0{1..9} {10..31} ; do
                # Find files matching YYMMDD
                file=$(find . -maxdepth 1 -type f -print | grep $i$j$k)
                # For each found file:
                for sf in $file ; do
                    # Find the folder with a different format
                    folder=$(find * -type d -print | grep $i-$j-$k)
                    echo -e "\nFile: $sf"
                    echo -e "Folder: $folder"
                    mv "$sf" "$folder/" # 2> /dev/null
                    echo -e "Moved $sf to $folder"
                done
            done
        done
    done
    cd .. # Change to your needs.
}
doMove

関連情報