将文件压缩在一起共享公共前缀

将文件压缩在一起共享公共前缀

我有一个包含 scsv 文件的目录,如下所示:

file1.scsv
file1_key.scsv
file1_flag.scsv
file1_typelist.scsv
files2.scsv
filass3.scsv
file4.scsv
file4_key.scsv
file4_flag.scsv
file5.scsv

即你有file1, files2,filass3等作为前缀。前缀长度变化很大,所以我不能依赖它。后缀_key_flag_typelist始终相同并且不会改变。

我想像这样压缩它们:

file1.zip 
     #contains 
     file1.scsv
     file1_key.scsv
     file1_flag.scsv
     file1_typelist.scsv
files2.zip 
     #contains 
     files2.scsv
filass3.zip 
     #contains 
     filass3.scsv
file4.zip 
     #contains 
     file4.scsv
     file4_key.scsv
     file4_flag.scsv
file5.zip 
     #contains 
     file5.scsv

我对 bash/linux 很陌生,所以我尝试遵循如何压缩具有相同名称但不同扩展名的文件?作为一个例子,但这假设文件在扩展名之前具有完全相同的名称。

答案1

我假设

files2.zip 
     #contains 
     files2.scsv
filass3.zip 
     #contains 
     filass3.scsv

是可以接受的;否则你必须澄清文件名转换规则。

for file in *.scsv; do
  if [[ ! "$file" =~ _ ]]; then
    base="${file%.scsv}"
    zip -9 "${base}.zip" "${file}" "${base}_*.scsv"
  fi
done

将查看带有.scsv扩展名的每个文件,以及其名称包含“_”,创建一个以它命名的 ZIP 文件(用.zip代替.scsv),包含该文件以及具有相同前缀且后跟下划线的任何其他文件。

这里有一个小技巧:我依靠zip的通配符处理而不是 shell 的通配符处理,以避免在没有其他文件可添加时处理问题。zip会对此发出警告,但不会中止。

相关内容