Как мне переименовать конкретный файл в нескольких zip-архивах через командную строку?
У меня есть около 200+ условно-бесплатных файлов в формате zip, каждый из которых содержит файл с именем "FILE_ID.DIZ". Мне нужно знать, как переименовать каждый экземпляр в "file_id.diz" в нижний регистр, не делая этого вручную - я уже прошел этот путь, и это довольно много времени. Этот файл должен быть в нижнем регистре, потому что программа BBS, которую я использую, игнорирует FILE_ID.DIZ в качестве описания, так как она в верхнем регистре. Если я вручную изменю его на строчные, описание будет успешно импортировано.
Я знаю, что у rar есть переключатель переименования, но тогда мне придется пакетно конвертировать все zip-файлы в rar, а затем обратно в zip. Я не исключаю этого полностью, но похоже, что до решения этой проблемы еще далеко.
Я нашел страницу справочника для "zip_rename", которая, похоже, могла бы сработать, но я понятия не имею, как на самом деле это реализовать.
Я отказываюсь делать это на машине с Windows - я просто не могу и не буду делать... это принцип;).
В любом случае, спасибо за ваше время!
2 ответа
Этот метод не переименовывает файл, но добавляет строчную версию файла.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
Вы можете использовать функцию переименования zipnote info-zip: http://www.info-zip.org/FAQ.html
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