如何使用for-each循环将所有.php文件删除到0777文件夹中

时间:2017-03-30 07:37:13

标签: php bash shell find xargs

以下命令尝试删除/ if文件夹权限0777

中的所有.php文件
find / -type f -perm 0777 -exec rm -rf *.php  \; -exec rm -rf *.html \;

find / -type d -perm 0777 -print0 | xargs -0 rm -rf *.php

它删除文件夹而不是php文件

我希望用终端ssh命令运行它

我搜索所有文件夹都有0777并将所有php文件删除到其中

1 个答案:

答案 0 :(得分:-1)

您可以轻松使用RecursiveDirectoyIterator执行此操作,如下所示:

$directory = 'test/';

$iterator = new RecursiveDirectoryIterator($directory);
$directoryIterator = new RecursiveIteratorIterator($iterator);

foreach ($directoryIterator as $file) {
    $octalPermission = substr(decoct($file->getPerms()), -4);
    $extension = $file->getExtension();
    if (!$file->isDir() && $octalPermission == '0777' && $extension == 'php') {
        // do some stuff
        unlink($file->getPathname());
    }
}

这将recursively在具有特定权限的特定目录中迭代您的php文件并将其删除。

仅用于当前目录 - 不递归 - 更改此信息:

$iterator = new RecursiveDirectoryIterator($directory);
$directoryIterator = new RecursiveIteratorIterator($iterator);

通过以下课程:

$directoryIterator = new DirectoryIterator($directory);

更新

但是,只要OP要求使用终端而不是php来执行此操作,

您可以使用以下命令:

find ./test/ -type f -name "*.php" -perm 0777 | xargs rm

更新2:

首先检查具有权限777的目录,如下所示:

find ./test/ -type d -perm 0777 | xargs -I {} find {} -type f -name "*.php" -perm 0777 | xargs rm

更新3:

要使此命令适用于包含空格/特殊字符的文件,您可以使用-d -delimiter选项将其设置为\n,如下所示:

find ./test/ -type d -perm 0777 \
| xargs -I {} find {} -type f -name "*.php" -perm 0777 \
| xargs -d '\n' rm
//      ^^^^^^^ notice this                                                  

这将找到带有php扩展名和权限0777的文件名,然后删除它们。

更新4(2017年3月31日)

对于任何以前的命令,当您尝试使用xargs命令和rm命令时,如果搜索条件中不存在任何文件,终端可能会提示如下错误:

rm: missing operand

要避免这种情况,您需要将-r选项添加到xargs:

-r, --no-run-if-empty        if there are no arguments, then do not run COMMAND;

您可以按如下方式使用它:

xargs -r -d '\n' rm