如何通过命令行批量重命名多个 zip 存档中的特定文件?

如何通过命令行批量重命名多个 zip 存档中的特定文件?

我有大约 200 多个 zip 格式的共享软件文件,每个文件都包含一个名为“FILE_ID.DIZ”的文件。我需要知道如何将每个实例重命名为小写的“file_id.diz”,而无需手动执行 - 我已经尝试过这种方法,而且非常耗时。该文件必须是小写的,因为我使用的 BBS 程序会忽略 FILE_ID.DIZ 作为描述,因为它是大写的。如果我手动将其更改为小写,则描述会成功导入。

我知道 rar 有一个重命名开关,但这样我就必须将所有 zip 文件批量转换为 rar,然后再转换回 zip。我并没有完全排除这种可能,但这似乎是解决这个问题的漫长道路。

我找到了“zip_rename”的手册页,它看起来似乎可以解决问题,但我不知道如何真正实现它。

我拒绝在 Windows 机器上执行此操作 —— 我就是不能也不会这样做...这是原则 ;)。

无论如何,感谢您的时间!

答案1

这种技术不会改名文件,但添加 .DIZ 文件的小写版本。希望它足以满足您的目的。

这利用了 zip 的“默认添加”功能,如果您指定现有的 zip 文件,它将向其中添加文件。因此,如果您这样做:

zip doom.zip file_id.diz

并且doom.zip存在,它只会将该file_id.diz文件添加到现有内容中。

这将在您的 zip 文件所在的目录中运行:

for i in  *zip; do rm FILE_ID.DIZ;  unzip "$i" FILE_ID.DIZ; mv FILE_ID.DIZ file_id.diz; zip -d "$i" FILE_ID.DIZ; zip "$i" file_id.diz; done

请注意,为了获得最佳效果,所有 .zip 文件名都不应包含空格。

您还可以将其放入文件中,例如rename.sh(这样看起来更美观并且更容易理解):

#!/bin/bash
for i in  *zip; do
   rm FILE_ID.DIZ
   unzip "$i" FILE_ID.DIZ
   mv FILE_ID.DIZ file_id.diz
   zip -d "$i" FILE_ID.DIZ
   zip "$i" file_id.diz
done

然后你就可以这样运行,例如bash rename.sh

答案2

您可以使用 info-zip 的 zipnote 的重命名功能: http://www.info-zip.org/FAQ.html#rename

for zip_filename in *.zip; do
    # Only process original zip files.
    if [ "${zip_filename%.fixed.zip}" = "${zip_filename}" ] ; then
        # Create a copy which will be modified later.
        cp ${zip_filename} ${zip_filename%.zip}.fixed.zip

        # Get all filenames, change some of them on the fly and write them to the zip file.
        zipnote ${zip_filename} \
          | sed -e 's/^@ \(.*\)FILE_ID.DIZ/@ \1FILE_ID.DIZ\n@=\1file_id.diz/' \
          | zipnote -w ${zip_filename%.zip}.fixed.zip
    fi
done

相关内容