Files
根據文件名將文件移動到目錄年/月/日
我有
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
. 對於每個文件,程式碼執行如下
- 包括一個允許創建目錄路徑的系統庫
- 匹配
YYYY_MM_DD
文件名開頭的結構- 創建對應的目錄路徑
YYYY/MM/DD
(如有必要)- 將文件移動(重命名)到其
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