Files

根據文件名將文件移動到目錄年/月/日

  • December 4, 2017

我有YYYY_MM_DD_HH:MM:SS.swf轉儲到文件夾中的格式的文件/home/user/dump/

我想根據文件名將這些文件移動到一個新的目錄樹/home/user/save/year/month/day/YYYY_MM_DD。或者,如果這些可以在文件修改日期之前修改,那也是可以接受的。我在這裡找到了其他幾個腳本,但它們似乎沒有我正在尋找的所有資訊。

如果你有基於 Perl 的rename(有時稱為prename),你可以用一個命令來做到這一點:

cd /home/user/dump
rename -v 'use File::Path qw(make_path); m!^((....)_(..)_(..)_(.*))!; my $d = "$2/$3/$4"; make_path($d); s!^!$d/!' *

實際上,這是對rename. 對於每個文件,程式碼執行如下

  1. 包括一個允許創建目錄路徑的系統庫
  2. 匹配YYYY_MM_DD文件名開頭的結構
  3. 創建對應的目錄路徑YYYY/MM/DD(如有必要)
  4. 將文件移動(重命名)到其YYYY/MM/DD目錄中,保持其名稱不變

Zsh

使用該zmv函式移動或重命名萬用字元表達式匹配的文件。沒有內置的方法來創建目標目錄,所以我提供了一個函式來完成它。

autoload -U zmv
mkdir_mv () {
 mkdir -p -- ${(P)#:h}
 mv -- $@
}
cd /home/user/dump
zmv -p mkdir_mv '(????)_(??)_(??)_??:??:??.swf' '/home/user/save/$1/$2/$3/$f'

POSIX 外殼

如果您需要可移植的解決方案,請在文件上使用 shell 循環,並使用 shell 字元串操作來提取文件名的各個部分。

cd /home/user/dump
for f in ????_??_??_??:??:??.swf; do
 year=${f%%_*}; suffix=${f#*_}
 month=${suffix%%_*}; suffix=${suffix#*_}
 day=${suffix%%_*}
 mkdir -p "/home/user/save/$year/$month/$day"
 mv "$f" "/home/user/save/$year/$month/$day/$f"
done

引用自:https://unix.stackexchange.com/questions/266606