Удалить файлы со специальными символами в именах файлов

Мне нужно удалить старые файлы со специальными символами в именах файлов, такими как пробел, ,, (, ), ! и т. д. через PHP. Классический unlink($filename) не работает для этих файлов. Как я могу преобразовать имена файлов в имена файлов, которые принимают функцию разъединения и файловую систему? Он работает на машине Solaris, и у меня нет другого доступа к нему.


person gadelat    schedule 29.12.2010    source источник


Ответы (4)


Как вы строите $filename? unlink должен работать с любым именем файла со специальными символами, если вы выполняете обычное экранирование. например

для файла с именем this has, various/wonky !characters in it, то

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

должно сработать.

person Marc B    schedule 29.12.2010
comment
Имя файла выводится из команды readdir, я сравниваю, используются ли файлы в каталоге с базой данных id, а если нет, удаляю ее. Я не избегаю этого имени файла, есть ли способ его автоматического удаления? Я должен добавить, что могут быть также символы cp-1250, такие как ž ľ č š и так далее... - person gadelat; 29.12.2010
comment
Что ж, если вы имеете дело с именами файлов, содержащими метасимволы оболочки, вам нужно избегать их. Unlink не будет знать, что / в имени файла на самом деле является частью имени файла, а не разделителем каталогов, если вы не избежите его самостоятельно. - person Marc B; 29.12.2010
comment
Символы cp-1250 не должны быть проблемой, если только по какой-либо причине PHP и/или ваш glibc не работает в это время с другой кодовой страницей/набором символов. Возможно (но маловероятно), что один из символов с акцентом в чужой кодировке может случайно сопоставиться с одним из метасимволов оболочки, например /, и тогда вы вернетесь к исходной точке. - person Marc B; 29.12.2010
comment
Файловые системы Solaris не позволяют / в именах файлов, это всегда разделитель каталогов, поэтому нет причин избегать его. - person alanc; 31.12.2010

unlink принимает любую допустимую строку и пытается удалить файл в этой строке.

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

Возможно, вы неправильно экранируете определенные символы.

person webbiedave    schedule 29.12.2010

Вы также можете найти все необходимые файлы и отвязать их с помощью 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\,.()!]+.)/', а затем удаляет их.

person Anatoly Orlov    schedule 29.12.2010

Я делаю это в Linux, используя абсолютные пути, такие как "rm ./filename" с косой чертой.

Вы также можете использовать escape-символы. Например, «rm \-filename», то есть дефис в обратном направлении.

person c1tadel1    schedule 29.12.2010