我有一个包含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>&-
感谢您的阅读。
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}
返回。添加一个邮编后缀。$name
csv
${name%csv}zip
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句