Linux 如何编写shell脚本为文件名中具有相同字符串的文件创建zip文件

Linux 如何编写shell脚本为文件名中具有相同字符串的文件创建zip文件,linux,bash,shell,Linux,Bash,Shell,如何编写简单的shell脚本来创建zip文件。 我想通过从文件夹中收集文件名中具有相同字符串模式的文件来创建zip文件 例如,文件夹下可能有许多文件 xxxxx_20140502_xxx.txt xxxxx_20140502_xxx.txt xxxxx_20140503_xxx.txt xxxxx_20140503_xxx.txt xxxxx_20140504_xxx.txt xxxxx_20140504_xxx.txt 运行shell脚本后,结果必须是以下三个zip文件 20140502

如何编写简单的shell脚本来创建zip文件。
我想通过从文件夹中收集文件名中具有相同字符串模式的文件来创建zip文件

例如,文件夹下可能有许多文件

  • xxxxx_20140502_xxx.txt
  • xxxxx_20140502_xxx.txt
  • xxxxx_20140503_xxx.txt
  • xxxxx_20140503_xxx.txt
  • xxxxx_20140504_xxx.txt
  • xxxxx_20140504_xxx.txt
运行shell脚本后,结果必须是以下三个zip文件

  • 20140502.zip
  • 20140503.zip
  • 20140504.zip

请给我正确的方向来创建简单的shell脚本以输出上述结果。

因为
zip
将更新存档,这将执行以下操作:

#!/bin/bash

for file in *_????????_*.csv *_????????_*.txt; do
        [ -f "${file}" ] || continue
        date=${file#*_}  # adjust this and next line depending
        date=${date%_*}  # on your actual prefix/suffix
        echo "${date}"
done | sort -u | while read date; do
        zip "${date}.zip" *${date}*
done
shopt -s nullglob
for file in *.{txt,csv}; do [[ $file =~ _([[:digit:]]{8})_ ]] && zip "${BASH_REMATCH[1]}.zip" "$file"; done
shopt-s nullglob
是因为如果没有匹配的文件,您不希望有未扩展的glob


这条线下的一切都是我的老答案

首先,获得所有可能的日期。试探性地,这可能是以与正则表达式匹配的
.txt
.csv
结尾的文件

#!/bin/bash
shopt -s nullglob
declare -A dates=()
for file in *.{csv,txt}; do
    [[ $file =~ _([[:digit:]]{8})_ ]] && dates[${BASH_REMATCH[1]}]=
done
printf "Date found: %s\n" "${!dates[@]}"
这将输出到标准输出文件中找到的所有日期。例如(我打电话给先前剪下的
gorilla
chmod+xgorilla
并触摸了一些文件进行演示):

下一步,对于找到的每个日期,将以
.txt
.csv
zip
结尾的所有文件放入与日期对应的存档中:将其附加到
gorilla
将完成以下工作:

for date in "${!dates[@]}"; do
    zip "$date.zip" *"_${date}_"*.{csv,txt}
done

删除泛洪部分后的完整脚本:

#!/bin/bash
shopt -s nullglob
declare -A dates=()
for file in *.{csv,txt}; do
    [[ $file =~ _([[:digit:]]{8})_ ]] && dates[${BASH_REMATCH[1]}]=
done
for date in "${!dates[@]}"; do
    zip "$date.zip" *"_${date}_"*.{csv,txt}
done

编辑。我用一行命令忽略了您的要求。那么这是一条线:

shopt -s nullglob; declare -A dates=(); for file in *.{csv,txt}; do [[ $file =~ _([[:digit:]]{8})_ ]] && dates[${BASH_REMATCH[1]}]=; done; for date in "${!dates[@]}"; do zip "$date.zip" *"_${date}_"*.{csv,txt}; done

:)

它一定要在bash中吗?你试过
男士邮政编码吗?我确信有一种方法可以指定要包含的文件的文件模式。为什么是单行命令?您知道日期吗?或者是查找所有表示的日期并为每个日期创建一个zip文件的任务?+1,非常详尽的答案…但是您应该加上一条免责声明,这只是由于使用了关联数组。
#!/bin/bash
shopt -s nullglob
declare -A dates=()
for file in *.{csv,txt}; do
    [[ $file =~ _([[:digit:]]{8})_ ]] && dates[${BASH_REMATCH[1]}]=
done
for date in "${!dates[@]}"; do
    zip "$date.zip" *"_${date}_"*.{csv,txt}
done
shopt -s nullglob; declare -A dates=(); for file in *.{csv,txt}; do [[ $file =~ _([[:digit:]]{8})_ ]] && dates[${BASH_REMATCH[1]}]=; done; for date in "${!dates[@]}"; do zip "$date.zip" *"_${date}_"*.{csv,txt}; done