如何使用 for-each 循环将所有 .php 文件删除到 0777 文件夹中
How do I use a for-each loop to remove all .php files into 0777 folders
如果文件夹权限为 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 个文件删除到其中
您可以轻松地使用 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);
通过以下 class :
$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:
要使此命令适用于具有 spaces/special 个字符的文件,您可以使用 -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
为避免这种情况,您需要向 xargs 添加 -r
选项:
-r, --no-run-if-empty if there are no arguments, then do not run COMMAND;
您可以按如下方式使用它:
xargs -r -d '\n' rm
如果文件夹权限为 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 个文件删除到其中
您可以轻松地使用 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);
通过以下 class :
$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:
要使此命令适用于具有 spaces/special 个字符的文件,您可以使用 -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
为避免这种情况,您需要向 xargs 添加 -r
选项:
-r, --no-run-if-empty if there are no arguments, then do not run COMMAND;
您可以按如下方式使用它:
xargs -r -d '\n' rm