根据文件名称的一部分将文件分为几组并压缩文件

时间:2019-07-03 21:37:22

标签: bash shell zip substring

我有一个文件夹,其中包含几个使用这种命名约定的文件(4个部分由下划线分隔):

  

Part1_Part2_Part3_Part4.csv

例如:

  

AAA_XXX_AAA001_20991231.csv
  AAA_XXX_AAA001_20991131.csv
  AAA_XXX_AAA002_20991031.csv
  AAA_XXX_AAA002_20990931.csv
  BBB_XXX_BBB001_20991231.csv
  BBB_XXX_BBB001_20991131.csv
  BBB_XXX_BBB002_20991031.csv
  BBB_XXX_BBB002_20990931.csv

我需要创建一个shell脚本,该脚本根据部分字符串Part1和Part3对其进行分组,并使用如下命名约定创建一个zip存档:

  

Part1_Part3.zip

例如名为的zip文件

  

“ AAA_AAA001.zip”应包含文件:

     

AAA_XXX_AAA001_20991231.csv
  AAA_XXX_AAA001_20991131.csv

     

“ AAA_AAA002.zip”应包含文件:

     

AAA_XXX_AAA002_20991231.csv
  AAA_XXX_AAA002_20991131.csv

     

与上面的“ BBB_BBBXXX.zip”相同。

文件的结构是固定的。 Part1始终在开头,Part3始终在第二个下划线之后。字符数可以变化。

我对Shell脚本完全陌生。我已经花了几个小时尝试处理字符串,压缩文件等,但是我无法利用这些知识来提供像这样的完整解决方案。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

首先获得所有组合part1-part3并使其成为唯一列表。 您可以将自己的选项添加到zip,我想您想要类似的东西

ls *_*_*.csv | cut -d_ -f1,3 | sort -u| while IFS=_ read -r part1 part3; do 
   echo "zipfile ${part1}_${part3}.zip"
   echo "Files ${part1}_*_${part3}_*.csv"
   zip ${part1}_${part3}.zip ${part1}_*_${part3}_*.csv
done

编辑:按照注释中的建议纠正了错字。