假设我有许多 csv 文件位于/home/user/test
123_24112021_DONG.csv
122_24112021_DONG.csv
145_24112021_DONG.csv
123_24112021_FINA.csv
122_24112021_FINA.csv
145_24112021_FINA.csv
123_24112021_INDEM.csv
122_24112021_INDEM.csv
145_24112021_INDEM.csv
Run Code Online (Sandbox Code Playgroud)
如您所见,所有文件都有三个唯一的前缀:
145
123
122
Run Code Online (Sandbox Code Playgroud)
而且,我需要为每个前缀创建 zip,其中将包含 csv 文件。请注意,实际上,我不知道 csv 文件的数量,这只是一个示例(每个前缀 3 个 csv 文件)。我开发了一个代码,可以从 bash 表中的所有 csv 名称中提取前缀:
for entry in "$search_dir"/*
do
# extract csv files
f1=${entry##*/}
echo $f1
# extract prefix of each file
f2=${f1%%_*}
echo $f2
# add prefix in table
liste_sirets+=($f2)
done
# get uniq prefix in unique_sorted_list
unique_sorted_list=($(printf "%s\n" "${liste_sirets[@]}" | sort -u ))
echo $unique_sorted_list
Run Code Online (Sandbox Code Playgroud)
结果如下:
145
123
122
Run Code Online (Sandbox Code Playgroud)
现在我想将由其前缀定义的每三个文件压缩在同一个 zip 文件中:换句话说,创建123_24112021_M2.zip其中将包含
123_24112021_DONG.csv
123_24112021_FINA.csv
123_24112021_INDEM.csv
Run Code Online (Sandbox Code Playgroud)
和122_24112021_M2.zip 145_24112021_M2.zip...
因此,我开发了一个循环,该循环将重点关注位于本地路径中的 csv 文件的每个前缀名称,然后压缩所有具有相同前缀名称的文件:
for i in $unique_sorted_list
do
for j in "$search_dir"/*
do
if $(echo $j| cut -d'_' -f1)==$i
zip -jr $j
done
Run Code Online (Sandbox Code Playgroud)
但是,它不起作用,请帮忙!谢谢 !
使用 bash 和 shell 实用程序:
#!/bin/bash
printf '%s\n' *_*.csv | cut -d_ -f1 | uniq |
while read -r prefix
do
zip "$prefix".zip "$prefix"_*.csv
done
Run Code Online (Sandbox Code Playgroud)
更新:
还要求按日期对文件进行分组(文件名的第二部分):
#!/bin/bash
printf '%s\n' *_*_*.csv | cut -d_ -f2 | sort -u |
while read -r date
do
zip "$date".zip ./*_"$date"_*.csv
done
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
638 次 |
| 最近记录: |