Командная строка Winrar не удаляет рекурсив, когда не используются подстановочные знаки - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь удалить некоторые файлы в архиве WinRar с помощью командной строки.

Rar-файл:

/testing.rar
/testing.rar/some-data.txt
/testing.rar/testing/some-data.txt

Вот мой код:

cd "C:\Program Files\WinRAR\" && rar d -cl -r "c:\full\path\testing.rar" some-data.txt

Удаляет только файл some-data.txt в корне, но не внутри / testing /

При использовании

cd "C:\Program Files\WinRAR\" && rar d -cl -r "c:\full\path\testing.rar" some-data.*

(изменил расширение на. *) Он удаляетоба файла.

Я что-то не так делаю?

Спасибо, Андре.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Я посмотрел на первую версию отличного решения MC ND и сам подумал, что произойдет, если в архиве случайно, хотя и очень маловероятно, каталог с именем some-data.txt?

Ответ заключается в том, что этот каталог со всеми файлами и подкаталогами также удаляется, поскольку он также указан в Rar.exe, а findstr не отфильтровывает запись списка в каталоге, так как он выглядит точно так же, как запись имени файла в пустом списке.формат.

Решение для кода, написанного MC ND , заключается в использовании команды Rar lb с переключателем -ed для фильтрации записей каталога при выводе списка,Это небольшое изменение было применено к командной строке MC ND в его ответе.

Затем я подумал об использовании переключателей -ed и -x"..." для фильтрации каталогов и имен файлов, которыене следует удалять при запуске Rar.exe с помощью команды d и шаблона some-data.txt с подстановочными знаками.

А вот решение с одной строкой:

"C:\Program Files\WinRAR\Rar.exe" d -ed -x"some-data.txt?*" -- "C:\full\path\testing.rar" "some-data.txt*"

Звездочка в концеимя файла необходимо для удаления всех файлов с именем some-data.txt внутри архива, включая файлы в подкаталогах.

Переключатель -ed исключает все каталоги в архиве, включая те, которые случайно названы some-data.txt.Каталоги в архиве, начинающиеся с some-data.txt и с дополнительными символами, добавленными как каталог с именем some-data.txt_dir, автоматически игнорируются Rar.exe с шаблоном подстановочного имени используемого файла.

Переключатель -x"some-data.txt?*" приводит к исключению файловначиная с some-data.txt и добавляя больше символов, таких как some-data.txt1 и some-data.txt10.Имена файлов, такие как first_some-data.txt, автоматически игнорируются Rar.exe с использованием шаблона подстановки имени используемого файла.

Переключатель -cl для преобразования имен файлов в нижний регистр игнорируется Rar при использованиикоманда d и поэтому не используется в командной строке выше. Rar интерпретирует имена файлов без учета регистра, как Windows.

Обновление:

Евгений Рошаль, владелец win.rar GmbH, сказал мнеОтправить по электронной почте более простой способ удаления файла в корневой папке архива и во всех подпапках:

"C:\Program Files\WinRAR\Rar.exe" d "C:\full\path\testing.rar" "some-data.txt" "*\some-data.txt"

Эта командная строка удаляет только some-data.txt в корневой папке архива (последний, кроме одного аргумента) и во всех ее подпапках (последний аргумент).Файлы в папке с именем some-data.txt не удаляются этой командной строкой, но пустая папка с именем some-data.txt также удаляется из архива.Переключатель -ed может использоваться дополнительно для предотвращения удаления пустой папки some-data.txt.

0 голосов
/ 26 сентября 2018

Хотя команда d не может справиться с этим, с ней может справиться простой канал

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "rar=C:\Program Files\WinRar\rar.exe"
    set "archive=c:\full\path\testing.rar"

    (
        %= List archive contents =%
        "%rar%" lb -ed "%archive%" 
    )|(
        %= filter the list for the file in any subfolder =%
        findstr /i /e /l /c:"\somedata.txt"

        %= and include the root file =%
        echo somedata.txt
    )|(
        %= Delete from archive the list of files read from stdin =%
        "%rar%" d -cl -n@ "%archive%"
    )

Второй шаг (фильтрация списка файлов в архиве) разбивается на findstr иecho только для предотвращения случая, когда удаляемый файл отсутствует в выводе.Без списка файлов модификатор -n@ (чтение файлов для удаления из stdin) ничего не будет читать, и все содержимое архива будет удалено.

...