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

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

私はスタックオーバーフローに初めて触れました。

あなたの助けが必要です。事前にお答えいただきありがとうございます。

似たような質問を見つけましたが、私の場合は明快な答えを得るのが難しかったです。

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

gawk1つの可能性は、時間操作機能を内蔵したGNU Awk()を使用することです。たとえば(存在する場合と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正しいことをしていると思われる場合は削除してください。コピーではなく移動したい場合に変更してくださいcpmv

ケースを移動する別のオプションは、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このオプションを使用してコマンドが詳細に印刷され、コマンドが何をしたかを知ることができます。

関連情報