Php 删除文件名中带有特殊字符的文件

Php 删除文件名中带有特殊字符的文件,php,solaris,filenames,character,unlink,Php,Solaris,Filenames,Character,Unlink,我需要删除文件名中带有特殊字符的旧文件,如空格、、、(、)、等等。经典取消链接($filename)不适用于这些文件。如何将文件名转换为接受取消链接函数和文件系统的文件名?它运行在Solaris机器上,我没有其他访问权限。我在Linux中的操作方式是使用绝对路径,如“rm./filename”即点斜杠 您还可以使用转义字符。与-backspash连字符的“rm \-filename”类似。取消链接接受任何有效字符串,并将尝试删除该字符串中的文件 unlink('/home/user1/"hell

我需要删除文件名中带有特殊字符的旧文件,如空格、
等等。经典
取消链接($filename)
不适用于这些文件。如何将文件名转换为接受取消链接函数和文件系统的文件名?它运行在Solaris机器上,我没有其他访问权限。

我在Linux中的操作方式是使用绝对路径,如“rm./filename”即点斜杠


您还可以使用转义字符。与-backspash连字符的“rm \-filename”类似。

取消链接接受任何有效字符串,并将尝试删除该字符串中的文件

unlink('/home/user1/"hello(!,');

可能您没有正确地转义某些字符。

如何构造
$filename
?如果对任何具有特殊字符的文件名执行正常转义,则取消链接应可用于该文件名。e、 g

对于一个名为
的文件,它有各种各样的/不可靠的!其中的字符
,然后

 $filename = 'this has\, various\/wonky \!characters in it';
 unlink($filename);

应该可以工作。

您还可以找到所有需要的文件,并使用RegexIterator取消链接:

<?php

$dir  = new RecursiveDirectoryIterator('.');
$iterator = new RecursiveIteratorIterator($dir);
$regex = new RegexIterator($iterator, '/(^.*[\s\.\,\(\)\!]+.*)/', RecursiveRegexIterator::GET_MATCH);

foreach ($regex as $file) {
        if (is_file($file[0])) {
                print "Unlink file {$file[0]}\n";
                unlink($file[0]);
        }
}

Filename是从readdir命令输出的,我比较目录中的文件是否用于id数据库,如果不是,则将其删除。我没有转义这个文件名,有办法自动转义吗?我需要补充的是,也可以有cp-1250字符,比如“žľčš”等等……如果您处理的文件名包含shell元字符,那么您确实需要转义这些字符。取消链接不会知道文件名中的
/
实际上是文件名的一部分,而不是目录分隔符,除非您自己转义它。cp-1250字符不应该是问题,除非出于任何原因,PHP和/或您的glibc当时正在处理不同的代码页/字符集。“foreign”字符集中的一个重音字符可能(但不太可能)碰巧映射到一个shell元字符,如
/
,然后你就回到了原点。Solaris文件系统不允许/in文件名,它总是一个目录分隔符,所以没有理由逃避它。