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

use*_*070 5 zip shell-script files

我有大约 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
Run Code Online (Sandbox Code Playgroud)

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

3000_ABCD_XXXXXXX.csv
3000_ABCD_YYYYYYY.csv
3000_ABCD_XYXYZYZ.csv
Run Code Online (Sandbox Code Playgroud)

EFGH.zip 将存储

3000_EFGH_XXXXXXX.csv
3000_EFGH_YYYYYYY.csv
3000_EFGH_XYXYZYZ.csv
Run Code Online (Sandbox Code Playgroud)

等等。

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

编辑:ABCD, EFGH,IJKL事先不知道。不过,它们在文件名中的位置和宽度是有保证的。

Sté*_*las 4

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]}
}
Run Code Online (Sandbox Code Playgroud)

(删除 ,echo满意后实际执行)。

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

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

(再次,删除"echo",来实际执行)。