將檔案名稱中包含日期的檔案複製到該日期的資料夾中

將檔案名稱中包含日期的檔案複製到該日期的資料夾中

我是堆疊溢位的新手。

我需要你的幫助。感謝您提前回覆。

我尋找類似的問題,但在我的案例中很難得到明確的答案。

我使用 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選項,因此該命令會詳細地列印出來,這樣您就知道它已經做了一些事情。

相關內容