我有大约 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