文件按照模式排序

文件按照模式排序

我正在处理大量具有固定名称结构的填充的管理,采用多列格式,由 _ 分隔:

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 

相关内容