Рекурсивно обробляють архіви zip, щоб витягувати файли, відкидаючи певний формат файлів


0

ОНОВЛЕННЯ: Я помітив, що багато людей переглядають цю тему, що змушує мене повірити, що ця ситуація не така вже й рідкісна. У всякому разі, я задавав подібне питання , пов'язаний / на SO тут , який має досить пристойні рішення , які теж могли б вирішити цю проблему в кращу сторону.

На моїй машині Windows 7 я маю довідник із завантаженими сміттєзвалищами в ZIP-архівах. Кожен архів містить декілька текстових файлів, PDF-файлів та рідко XML-файлів. Я хочу витягнути весь вміст кожного архіву ZIP у відповідну папку (повинна бути створена під час процесу), відкидаючи / ігноруючи вилучення PDF-файлів. Після вилучення необхідних файлів з архіву оброблений zip не повинен видалятися (або я хотів би знати, як я можу ним керувати в різних ситуаціях).

Якщо це допомагає дізнатися, кількість архівів у каталозі знаходиться в межах 60k-70k. Також мені потрібні окремі вихідні каталоги, оскільки файли в архіві можуть мати ті ж імена, що й файли в інших.

Наприклад,

  • У мене є всі мої архіви , як one.zip, two.zip, .., скажімо,D:\data
  • Я створюю нову папку для оброблених даних, скажімо, D:\extracted
  • Тепер дані з цього документа D:\data\one.zipповинні перейти D:\extracted\one. Тут D:\extracted\oneслід створювати автоматично.
  • Під час цього повного процесу нестискування всі зустрічаються PDF-файли не повинні бути вилучені (ігноруватися). Немає сенсу витягувати та видаляти.
  • (Необов'язково) Файл журналу А повинна підтримуватися на рівні, скажімо,D:\extracted. Ідея полягає у використанні цього файлу для відновлення обробки з того місця, де він був залишений у разі помилки.
  • (Необов’язково) Сценарій повинен дозволити мені вирішити, чи хочу я зберігати вихідні архіви чи видаляти їх після обробки.

Я вже кілька разів шукав рішення, але не зміг його знайти. Я натрапив на кілька подібних питань

  1. Рекурсивно розпакуйте файли, де вони перебувають, а потім видаліть архіви
  2. Екстракт 7 блискавок рекурсивно
  3. Чи можна рекурсивно перераховувати вміст zip-файлів із 7-ма ZIPми без вилучення

але вони не дуже допомогли (до речі, я не професіонал із Windows). Я відкритий для встановлення безпечного та безкоштовного стороннього програмного забезпечення (з відкритим кодом) на зразок 7-zip.

EDIT: Чи є в наявності інструмент для виконання того, що мені потрібно, я вже спробував Multi Unpacker . Він не створює нових каталогів, не може ігнорувати * .pdf файли. Починати це навіть повільно, я думаю, що він спочатку читає всі архіви в джерелі, перш ніж починати їх обробляти.

Спасибі заздалегідь!


Я не бачу цього способу без сценарію пакетної чи власної оболонки, наскільки я знаю, що немає подібного рішення для чогось подібного.
private_meta

@private_meta дякую за вашу відповідь. Я вже здогадувався про це, але це добре. Чи можете ви вказати мені в правильному напрямку, щоб написати для цього патрон. Я також розумію, що ігнорування PDF-файлів під час вилучення - це величезна проблема, тому я готовий дозволити сценарію витягнути все, а потім видалити PDF-файли.
Fr0zenFyr

Відповіді:


1

Змінюючи відповідь, знайдений тут , цей фрагмент сценарію PowerShell повинен робити все, що ви хочете. Просто збережіть його як файл із розширенням ".ps1". Викликаючи його, просто зателефонуйте як ./filename.ps1, і він витягне файли в окремі папки, видалить zip-файли та видалить усі файли з розширенням .pdf. Я не перевіряв, чи правильно він працює з рекурсивними шляхами, але слід, будь ласка, перевірити його.

Редагувати: Якщо ви не хочете, щоб ваші поштові файли були видалені, видаліть або коментуйте рядок (#)rmdir -Path $_.FullName -Force

Вимоги: PowerShell, 7-zip та для вас встановлення 7-zip шляху у файлі.

param([string]$folderPath="D:\Blah\files")

Get-ChildItem $folderPath -recurse | %{ 

    if($_.Name -match "^*.`.zip$")
    {
        $parent="$(Split-Path $_.FullName -Parent)";    
        write-host "Extracting $($_.FullName) to $parent"

        $arguments=@("e", "`"$($_.FullName)`"", "-o`"$($parent)\$($_.BaseName)`"");
        $ex = start-process -FilePath "`"C:\Program Files\7-Zip\7z.exe`"" -ArgumentList $arguments -wait -PassThru;

        if( $ex.ExitCode -eq 0)
        {
            write-host "Extraction successful, deleting $($_.FullName)"
            rmdir -Path $_.FullName -Force
            $arguments1="$($parent)\$($_.BaseName)\*.pdf"
            rmdir -Recurse -Path $arguments1
        }
    }
}

Я думав просити вас допомогти мені змінити код з тієї самої відповіді, ви читач розуму. Я спробую цей код і тут повідомлю про хід. Я дуже радий, що ти потребував часу, щоб уважно прочитати моє запитання і висвітлив майже кожен його аспект.
Fr0zenFyr

Ви можете використовувати його як основу та змінювати за потребою. Частина про не вилучення файлів PDF в першу чергу є головною проблемою, я не думаю, що це буде працювати з звичайними інструментами.
private_meta

Крім того, якщо ви використовуєте декілька "парам", вам потрібно викликати їх так: "./script.ps-FolderPath path -delete" тощо. Щодо комутаторів, зверніться до цього
private_meta

Спасибі товаришу, я накидаю на тебе капелюх. Цей сценарій досяг майже всього, що я хотів (крім речі файлу журналу). Оскільки немає кращої відповіді, ніж ця, я приймаю вашу відповідь як рішення. О, і BTW, за замовчуванням PowerShell моєї системи не дозволив мені запустити сценарій, кажучи, що він відключений. У мене було два варіанти: або підписати сценарій, або виконати set-ExecutionPolicy Unrestrictedв PowerShell як адміністратор. Я спробував і те, і вони працювали, хоча 1-й - кращий вибір, але поза рамками цього коментаря, щоб пояснити, чому.
Fr0zenFyr

1
Якщо замінити $arguments=@("e",з $arguments=@("x", нею повинні зберегти структуру каталогів, будь ласка , перевірити це. Щодо рекурсивного вилучення, я не знаю, чи працює він належним чином, але те, що ви можете зробити, - це викликати сценарій з новим каталогом, в цьому випадку кожен підкаталог. Якщо в кореневому розташуванні папки є zip-файл, він розпакує його. Інакше вийде набагато складніше. Я не досить хороший з повноваженнями.
private_meta
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.