我正在处理大量具有固定名称结构的填充的管理,采用多列格式,由 _ 分隔:
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
我如何修改它以匹配第一列的所有演示模式?
答案1
使用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'
)
其中[A-Z0-9](#c4)
匹配 4 个英文大写字母(在 中zsh
,仅匹配它们,而不匹配 Ŕ
, Æ
,
答案2
如果您只需要四个字符,请使用?
单个字符四次:
for dlg in "$FILES"/????_*.dlg