Имеет ли glob() отрицание?
Я знаю, что могу это сделать...
glob('/dir/somewhere/*.zip');
... чтобы все файлы заканчивались на .zip
, но есть ли способ вернуть все файлы, которые не являются ZIP файлами?
Или нужно просто перебрать и отфильтровать их с помощью этого расширения?
Ответы
Ответ 1
Я не думаю, что glob может сделать "не-подстановочный знак"...
Я вижу как минимум два других решения:
Ответ 2
Вы всегда можете попробовать что-то вроде этого:
$all = glob('/dir/somewhere/*.*');
$zip = glob('/dir/somewhere/*.zip');
$remaining = array_diff($all, $zip);
Хотя, используя один из других методов, упомянутый Паскаль может быть более эффективным.
Ответ 3
Быстрое обращение к glob()
для всего и использование preg_grep()
для фильтрации файлов, которые вы не хотите.
preg_grep('#\.zip$#', glob('/dir/somewhere/*'), PREG_GREP_INVERT)
Также см. Шаблоны Glob для сопоставления файлов в PHP
Ответ 4
Этот шаблон будет работать:
glob('/dir/somewhere/*.{?,??,[!z][!i][!p]*}', GLOB_BRACE);
который находит все в /dir/where/end в точке, за которой следует
- один символ (
?
)
- или два символа (
??
)
- или ничего не начинающегося с последовательной буквы z, i, p (
[!z][!i][!p]*
)
Ответ 5
$dir = "/path";
if (is_dir($dir)) {
if ($d = opendir($dir)) {
while (($file = readdir($d)) !== false) {
if ( substr($file, -3, 3) != "zip" ){
echo "filename: $file \n";
}
}
closedir($d);
}
}
NB: "." и ".." не позаботились. Осталось для завершения OP