Удалить файлы со специальными символами в именах файлов - PullRequest
3 голосов
/ 29 декабря 2010

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

Ответы [ 4 ]

2 голосов
/ 29 декабря 2010

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

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

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

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

1 голос
/ 30 декабря 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\,.()!]+.)/', затем удалите их.

1 голос
/ 29 декабря 2010

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

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

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

0 голосов
/ 29 декабря 2010

В Linux я использую абсолютные пути, например, «rm ./filename», то есть точка-косая черта.

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

...