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

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

私はスタックオーバーフローの初心者です。

あなたの助けが必要です。ご返信をよろしくお願いいたします。

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

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

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

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

このスクリプトは毎日深夜に実行されます。

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

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

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

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

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

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

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

答え1

私の理解が正しければ、GNU でこれを試すことができますgrep:date

shopt -s nullglob
for file in *.avi *.mp4; do 
  dat=$(echo "$file" | grep -Po "(?<=\.)[0-9]{6}(?=\.)")
  if [[ $(date "+%y%m%d" -d "$dat") ]]; then
    dir=$(date -d "$dat" "+%Y-%m-%d(%a)")
    cp "$file" "$dir"
  fi
done

答え2

1つの可能性としては、組み込みの時間操作関数を持つGNU Awk ( )を使用することですgawk。たとえば、 を持っている場合、 および のGNU実装もあると仮定しgawkます。cpmv

printf '%s\n' *.mp4 *.avi | gawk -F. '
  {
    datespec = sprintf("20%02d %02d %02d 00 00 00", substr($2,1,2), substr($2,3,2), substr($2,5,2)); 
    cmd = sprintf("echo cp -t %s/ -- %s", strftime("%Y-%m-%d\\(%a\\)",mktime(datespec)), $0);
    system(cmd)
  }
'
cp -t 2020-03-29(Sun)/ -- EFGHIJKH.200329.1080p.mp4
cp -t 2020-03-28(Sat)/ -- ABCDABCD.200328.avi

echo正しく動作していることに満足したら、を削除します。コピーではなく移動したい場合は、cpに変更します。mv

移動の場合の別のオプションとしては、Perl ベースのrenameユーティリティを (悪用して) 使用することが考えられます。

$ rename -n -e 'BEGIN{use Time::Piece}' -e 's@^[^.]*[.]([0-9]{6})[.].*$@Time::Piece->strptime($1,"%y%m%d")->strftime("%Y-%m-%d(%a)/") . $_@e' *.mp4 *.avi
rename(EFGHIJKH.200329.1080p.mp4, 2020-03-29(Sun)/EFGHIJKH.200329.1080p.mp4)
rename(ABCDABCD.200328.avi, 2020-03-28(Sat)/ABCDABCD.200328.avi)

ここで、-nテスト後に削除します。

答え3

ビデオ ファイルが保存されているフォルダーに移動する場合はcd、次のコマンドを使用してファイルを移動できるはずです。

mv -v *YYMMDD* /path-to-new-folder

これはパターン マッチを使用して、ファイル名にその日付形式が含まれるファイルのみを移動します。私は通常、-vオプションを使用します。これにより、コマンドは詳細に出力され、何かが行われたことがわかります。

関連情報