根据包含的文件名批量重命名zip文件

用户名

我有一个包含15000个zip文件的目录。我想重命名所有文件,这些文件在解压缩后包含以下格式的文件

YYYYMMDD_IPC.csv

这里YYYYMMDD恰好是一个日期,但对于这个问题的目的是正好8个数字的字符串。然后,应将zip文件本身重命名为

YYYYMMDD_IPC.zip.

我已经到达了以下命令行,但是我不知道如何YYYYMMDD从包含的文件中捕获要重命名zip文件所使用的文件:

find . -iname '*.zip' | while read file; do unzip -l "$file" | grep -q -P '\d{8}_IPC.csv' && echo $file; done 2>&- 

感谢您的阅读。

约翰1024
find . -iname '*.zip' -exec bash -c 'name=$(unzip -qql "$1"  '*_IPC.csv' | grep -oE '[[:digit:]]{8}_IPC.csv' | head -n1); [ "$name" ] && mv "$1" "${name%csv}zip"' none {} ';'

怎么运行的

该命令的格式为:

find . -iname '*.zip' -exec bash -c '...' none {} ';'

这将在当前目录及其下的所有子目录中搜索.zip文件。对于找到的每个此类文件,将执行单引号中的bash命令。找到的文件名在参数b处提供$1给bash命令。在我们的例子中,bash命令包含两个部分。第一个提取csv文件名并将其保存在bash变量中name

name=$(unzip -qql "$1"  '*_IPC.csv' | grep -oE '[[:digit:]]{8}_IPC.csv' | head -n1)

上面使用命令替换$(...)运行内部命令并捕获其标准输出。在这种情况下,我们将其分配给变量name该命令unzip -qql "$1" '*_IPC.csv'从zip文件中悄悄地提取与glob匹配的所有文件名*_IPC.csv我们不需要限制在全局范围内,*_IPC.csv但是,如果zip文件中包含许多文件,则可能会加快处理速度。

grep命令rep -oE '[[:digit:]]{8}_IPC.csv'进一步仅选择以8位数字开头的名称。head -n1命令选择找到的第一个这样的名称。如果只有一个这样的名称,则head -n1不需要。但是,保持head可能会加快速度,因为这会导致管道在第一个匹配项之后终止。

第二部分测试我们是否成功获取了一个非空name文件,如果是,则重命名该zip文件:

[ "$name" ] && mv "$1" "${name%csv}zip"

上面使用后缀删除功能将csv文件名更改为zip文件名。删除后缀后${name%csv}返回添加一个邮编后缀。$namecsv${name%csv}zip

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章