Bash:共通部分文字列でファイルを圧縮/グループ化する

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事前に知らなかった。ただし、ファイル名の場所と幅は保証されます。

ベストアンサー1

そして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(またはzshcshbashに似ていない他のシェルで)使用:

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

"echo",実際に実行するには削除してください。)

おすすめ記事