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
事先不知道。不过,它们在文件名中的位置和宽度是有保证的。
和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",
来实际执行)。