
我是堆疊溢位的新手。
我需要你的幫助。感謝您提前回覆。
我尋找類似的問題,但在我的案例中很難得到明確的答案。
我使用 Synology DS1515+ 和 DSM 6.2.2。
首先,我使用以下腳本建立了包含日期的每日資料夾;
mkdir /volume1/video/$(date +%Y-%m-%d\(%a\))
該腳本在每天午夜執行。
並且下載了一些視頻檔。這些檔案名稱包含日期
例如,ABCDABCD.200328.avi 或 EFGHIJKH.200327.1080p.mp4
檔案名稱沒有特定的規則,但 YYMMDD 類型的每個檔案名稱中都包含日期。
我想將這些文件複製到包含相同日期的資料夾中。
(資料夾自動產生的內容如上面我解釋的)
您能幫忙或解釋一下如何做嗎?
再一次非常感謝你。祝你有美好的一天。
答案1
如果我理解正確的話,你可以用 GNUgrep
嘗試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
具有內建時間操作函數的 GNU Awk ( )。例如(假設如果您有gawk
,那麼您也有cp
和的 GNU 實作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
移動案例的另一個選擇可能是(ab)使用基於 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
選項,因此該命令會詳細地列印出來,這樣您就知道它已經做了一些事情。