Bash:按公用子字符串压缩/分组文件

用户名

我大约有100个文件。

他们被这样命名。

3000_ABCD_XXXXXXX.csv
3000_ABCD_YYYYYYY.csv
3000_ABCD_XYXYZYZ.csv

3000_EFGH_XXXXXXX.csv
3000_EFGH_YYYYYYY.csv
3000_EFGH_XYXYZYZ.csv

3000_IJKL_XXXXXXX.csv
3000_IJKL_YYYYYYY.csv
3000_IJKL_XYXYZYZ.csv

目前,我正在分别压缩每个文件,但是我想根据它们的公共子字符串ABCD.zip它们分组,例如将存储

3000_ABCD_XXXXXXX.csv
3000_ABCD_YYYYYYY.csv
3000_ABCD_XYXYZYZ.csv

EFGH.zip 将存储

3000_EFGH_XXXXXXX.csv
3000_EFGH_YYYYYYY.csv
3000_EFGH_XYXYZYZ.csv

等等。

我对Unix / Bash脚本非常陌生。有人能指出我正确的方向吗?

编辑:ABCDEFGHIJKL事先不知道。但是,可以保证它们在文件名中的位置和宽度。

斯蒂芬·查泽拉斯(Stephane Chazelas)

zsh

setopt extendedglob
typeset -A a
for f (./*) {
  [[ $f = (#b)*_(*)_* ]] &&
    a[$match]+=$f$'\0'
}
for z (${(k)a}) {
  echo zip ./$z.zip ${(ps:\0:)a[$z]}
}

echo如果满意,请删除实际执行此操作)。

使用perl(从zsh/bash或任何其他非类似csh的shell):

perl -e 'for (@ARGV) {push @{$a{$1}}, $_ if (/_(.*)_/s)}
  system "echo", "zip", "./$_.zip", @{$a{$_}} for (keys %a)' ./*_*_*

(再次删除"echo",以实际操作)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章