Linux: распакуйте архив, содержащий файлы с тем же именем - PullRequest
5 голосов
/ 13 октября 2009

Мне прислали zip-файл, содержащий 40 файлов с одинаковыми именами. Я хотел извлечь каждый из этих файлов в отдельную папку ИЛИ извлечь каждый файл с другим именем (file1, file2 и т. Д.).

Есть ли способ сделать это автоматически с помощью стандартных инструментов Linux? Чек на мужском молнии не показал ничего, что могло бы мне помочь. zipsplit также, по-видимому, не допускает произвольного разделения zip-файлов (я пытался разбить zip-архив на 40 архивов, каждый из которых содержит один файл).

В данный момент я (и) переписываю свои файлы по отдельности. Это не такая большая проблема с 40-файловым архивом, но, очевидно, не масштабируемая.

У кого-нибудь есть хороший, простой способ сделать это? Более любопытно, чем что-либо еще.

Спасибо.

Ответы [ 3 ]

7 голосов
/ 13 октября 2009

Предполагая, что такого инструмента в настоящее время не существует, тогда его будет довольно легко написать на python. В Python есть модуль zipfile , которого должно быть достаточно.

Примерно так (может быть, не проверено):

#!/usr/bin/env python

import os
import sys
import zipfile

count = 0

z = zipfile.ZipFile(sys.argv[1],"r")

for info in z.infolist():
    directory = str(count)
    os.makedirs(directory)
    z.extract(info,directory)
    count += 1

z.close()
3 голосов
/ 10 декабря 2012

Я знаю, что это пара лет, но ответы, приведенные выше, не решили мою конкретную проблему здесь, поэтому я подумал, что должен пойти дальше и опубликовать решение, которое работает для меня.

Без сценариев вы можете просто использовать командную строку для взаимодействия с текстовым интерфейсом инструментов распаковки. То есть, когда вы вводите это в командной строке:

unzip file.zip

и содержит файлы с одинаковыми именами, вам будет предложено:

replace sameName.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename:

Если вы хотите сделать это вручную, введите «r», а затем в следующем приглашении:

new name:

вы просто наберете новое имя файла.

Чтобы автоматизировать это, просто создайте текстовый файл с ответами на эти приглашения и используйте его в качестве входных данных для распаковки, как показано ниже.

r
sameName_1.txt
r
sameName_2.txt
...

Это генерируется довольно легко, используя ваш любимый язык сценариев. Сохраните его как unzip_input.txt, а затем используйте его как вход для распаковки:

unzip < unzip_input.txt

Для меня это была меньшая головная боль, чем попытка заставить модули извлечения Perl или Python работать так, как мне нужно. Надеюсь, это кому-нибудь поможет ...

2 голосов
/ 30 июля 2012

вот версия скрипта linux

в этом случае 834733991_T_ONTIME.csv - это имя файла, который одинаков внутри каждого zip-файла, и .csv после «$ count» просто нужно заменить на нужный тип файла

#!/bin/bash

count=0

for a in *.zip
do
    unzip -q "$a"
    mv 834733991_T_ONTIME.csv "$count".csv
    count=$(($count+1))
done`
...