Bash
根據模式對文件進行排序
我正在處理具有固定名稱結構的大量填充的管理,採用由_分隔的多列格式:
3000_12_lig_cne_158.dlg 1300_10_lig_cne_983.dlg 4000_09_lig_cne_158.dlg 5000_09_lig_cne_158.dlg 7000_09_lig_cne_158.dlg 10V1_06_lig_cne_983.dlg 10V2_11_lig_cne_158.dlg N000_12_lig_cne_158.dlg M000_10_lig_cne_158.dlg E000_10_lig_cne_158.dlg
所以第一列可以包含四個數字(如 7000)或數字和字母的組合(如 N000 或 10V1)。
使用一些 bash 常式,我必鬚根據第一列名稱對所有這些填充進行排序,為每個曲目創建與第一列名稱匹配的子目錄。因此,對於展示的填充列表,應創建總共 10 個目錄(3000、1300、E000、M000、10V1、10V2 等)。
對於第一列中只有數字編號的填充,我可以使用以下路由,它在 FOR 循環中使用正則表達式對填充進行排序。
for i in ${FILES}/[0-9]*_*.dlg # match the filles containing only digits in the first column do j=${i##*/} # strip the path off from beginning to last / mkdir -p $OUTPUT/${j%%_*} # create dir with the name matching the first column of the file mv $i $OUTPUT/${j%%_*} # move the file to the corresponded directory done
我如何修改它以匹配第一列的所有展示模式?
如果您只需要四個字元,請使用
?
一個字元四次:for dlg in "$FILES"/????_*.dlg
使用
zsh
(您的腳本已經在zsh
語法中,而不是bash
因為您沒有引用參數擴展):autoload zmv # best in ~/.zshrc zmodload zsh/files # makes mkdir and mv (and a few other file manipulation # utilities) builtin to speed things up. mkmv() { mkdir -p -- $2:h && mv -- "$@"; } ( cd -P -- "$FILES" && zmv -P mkmv '([A-Z0-9](#c4))_*.dlg' '$1/$f' )
Where
[A-Z0-9](#c4)
匹配 4 個英文大寫字母(並且zsh
僅在 , 它們中,而不是Ŕ
,Æ
,🆘
, 等其他 shell 通常會包含在那裡)或十進制數字(同樣,它們僅匹配,而不是²
,🆢
,𝍤
…bash
例如包括)。請注意,您
[0-9]*_*.dlg
的不是0
正則表達式,它是一個 shell 萬用字元,它匹配以to9
範圍中的一個字元開頭的文件名(bash
在大多數語言環境中包括數百個字元),後跟任意數量的字元 (*
),後跟_
後跟任意數量的字元,後跟.dlg
. 正則表達式等效項是^[0-9].*_.*\.dlg$
.