似たような質問を見つけましたが、私の場合は明快な答えを得るのが難しかったです。
私は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(月)
どうすれば助けたり説明したりできますか?
説明すれば、上記のように私の場合のディレクトリパスも一緒に入れてください。
(私が理解していないので、私が推薦したコードを適用できなかったので申し訳ありません。)
もう一度ありがとうございます。良い一日になってください。
答え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
- 作業中にエコーを削除します。
- nullでないことを確認するチェックを追加する方が良いかもしれません
$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