我在WIN7上,使用PHP和Gnu CoreUtils 5.3.0 我需要从带有掩码的文件夹中递归删除,例如所有* .php和* .txt文件。
exec(
'rm -rf ../root_compressed/*.php *.txt'
//.' '.$SILENT
, $out, $ret);
if($ret)
die("\nERROR!!!\n");
这个失败了 rm:不能lstat` * .txt':无效的参数
现在使用
shell_exec(
'rm -rf ../root_compressed/*.php *.txt'
//.' '.$SILENT
);
这很有效。
我需要exec(),因为我想知道成功与否。 rm有什么问题?
答案 0 :(得分:2)
如果* .txt文件也位于root_compressed文件夹中,则还需要在rm命令中包含该文件:
exec(
'rm -rf ../root_compressed/*.php ../root_compressed/*.txt'
//.' '.$SILENT
, $out, $ret);
如果您的服务器支持,您还可以使用花括号扩展:
exec(
'rm -rf ../root_compressed/*.{php,txt}'
, $out, $ret);
请注意,-r
命令上的递归标志(rm
)在这种情况下不会做太多,因为您只是明确查看* .php和* .txt条目。因此,除非您的子文件夹以这样的名称命名,否则不会以递归方式从root_compressed文件夹中的每个子文件夹中删除所有* .php和* .txt。
我尝试使用find
获取单行命令,但我无法在一个参数中接受两种文件类型。对于要删除的每种文件类型,您必须多次使用find ../root_compressed -type f -name "*.php" -delete
之类的内容。
但是,使用SPL库自行编写脚本很容易:
$dir_iterator = new RecursiveDirectoryIterator("../root_compressed");
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $file) {
if ($file->isFile() && preg_match("~\.(php|txt)$~i", $file->getFilename())) {
unlink($file->getRealpath());
}
}