php,exec,shell exec,rm不能lstat

时间:2017-12-25 23:15:41

标签: php

我在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有什么问题?

1 个答案:

答案 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());
    }
}