我正在尝试使用命令行删除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
(将扩展名更改为。*),它确实删除了两个文件。
我做错什么了吗?
谢谢, 安德烈。
答案 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%"
)
第二步(过滤归档文件列表)在findstr
和echo
中分开,只是为了防止输出中不存在要删除的文件的情况。如果没有文件列表,则-n@
修饰符(读取要从stdin
中删除的文件)将不会读取任何内容,并且所有存档内容都将被删除。
答案 1 :(得分:1)
我查看了MC ND的最佳解决方案的第一个版本,我自己想,如果偶然发现存档中名称为some-data.txt
的目录是偶然的情况会发生什么?
答案是该目录及其所有文件和子目录也被删除,因为Rar.exe
和findstr
也会列出该目录,因为它看起来像一个裸露列表格式的文件名条目。
由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.txt
和some-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
。