
私はスタックオーバーフローの初心者です。
あなたの助けが必要です。ご返信をよろしくお願いいたします。
同様の質問を探しましたが、私の場合は明確な答えを得るのは困難でした。
私は 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
ます。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
オプションを使用します。これにより、コマンドは詳細に出力され、何かが行われたことがわかります。