不使用通配符时,Winrar命令行不会删除递归

时间:2018-09-26 12:21:57

标签: cmd winrar

我正在尝试使用命令行删除WinRar存档中的某些文件。

Rar文件:

$arr = ['a', 'b', 'c'];
$x = 0;

do{

    //do something here...

    //and something here...

    foreach($arr as $k => $v){
        if($x > 4){
            break 2;
        } else{
            echo '(' . $x . ')' . $k . ' - ' . $v . '<br />';
        }
    }

    $x++;
} while($x < 10);

这是我的代码:

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

它仅删除根目录中的some-data.txt文件,而不删除/ testing /

中的文件

使用

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

(将扩展名更改为。*),它确实删除了两个文件。

我做错什么了吗?

谢谢, 安德烈。

2 个答案:

答案 0 :(得分:1)

尽管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%"
    )

第二步(过滤归档文件列表)在findstrecho中分开,只是为了防止输出中不存在要删除的文件的情况。如果没有文件列表,则-n@修饰符(读取要从stdin中删除的文件)将不会读取任何内容,并且所有存档内容都将被删除。

答案 1 :(得分:1)

我查看了MC ND的最佳解决方案的第一个版本,我自己想,如果偶然发现存档中名称为some-data.txt的目录是偶然的情况会发生什么?

答案是该目录及其所有文件和子目录也被删除,因为Rar.exefindstr也会列出该目录,因为它看起来像一个裸露列表格式的文件名条目。

MC ND编写的代码的解决方案是使用 Rar 命令lb和开关-ed来过滤列表输出中的目录条目。 MC ND在他的回答中将这一小的修改应用于命令行。

然后,我想到了使用开关-ed-x"..."过滤掉目录和文件名,这些目录和文件名在运行Rar.exe并使用命令d和{ {1}}通配符模式。

这是单行解决方案:

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.txtsome-data.txt1)的文件。 some-data.txt10会使用已使用的文件名通配符模式自动忽略诸如first_some-data.txt之类的文件名。

使用命令Rar.exe时, Rar 会忽略将文件名转换为小写的开关-cl,因此在上面的命令行中未使用。 Rar 像Windows一样解释不区分大小写的文件名。

更新

win.rar GmbH的所有者Eugene Roshal通过电子邮件告诉我一种更简便的方法,用于删除根目录文件夹和所有子文件夹中的文件:

d

此命令行仅删除根存档文件夹(最后一个参数)及其所有子文件夹(最后一个参数)中的"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