私はスタックオーバーフローに初めて触れました。
あなたの助けが必要です。事前にお答えいただきありがとうございます。
似たような質問を見つけましたが、私の場合は明快な答えを得るのが難しかったです。
私は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
gawk
1つの可能性は、時間操作機能を内蔵したGNU Awk()を使用することです。たとえば(存在する場合とGNU実装gawk
もあると仮定)cp
mv
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
このオプションを使用してコマンドが詳細に印刷され、コマンドが何をしたかを知ることができます。