Мне нужно удалить старые файлы со специальными символами в именах файлов, такими как пробел, ,
, (
, )
, !
и т. д. через PHP. Классический unlink($filename)
не работает для этих файлов. Как я могу преобразовать имена файлов в имена файлов, которые принимают функцию разъединения и файловую систему? Он работает на машине Solaris, и у меня нет другого доступа к нему.
Удалить файлы со специальными символами в именах файлов
Ответы (4)
Как вы строите $filename
? unlink должен работать с любым именем файла со специальными символами, если вы выполняете обычное экранирование. например
для файла с именем this has, various/wonky !characters in it
, то
$filename = 'this has\, various\/wonky \!characters in it';
unlink($filename);
должно сработать.
/
в имени файла на самом деле является частью имени файла, а не разделителем каталогов, если вы не избежите его самостоятельно.
- person Marc B; 29.12.2010
/
, и тогда вы вернетесь к исходной точке.
- person Marc B; 29.12.2010
unlink принимает любую допустимую строку и пытается удалить файл в этой строке.
unlink('/home/user1/"hello(!,');
Возможно, вы неправильно экранируете определенные символы.
Вы также можете найти все необходимые файлы и отвязать их с помощью 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]);
}
}
Этот фрагмент кода рекурсивно обходит все каталоги из текущего ('.') и сопоставляет все файлы с помощью регулярного выражения '/(^.[\s\,.()!]+.)/', а затем удаляет их.
Я делаю это в Linux, используя абсолютные пути, такие как "rm ./filename" с косой чертой.
Вы также можете использовать escape-символы. Например, «rm \-filename», то есть дефис в обратном направлении.