我有一个包含 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
会对此发出警告,但不会中止。