Имеет ли glob() отрицание?

Я знаю, что могу это сделать...

glob('/dir/somewhere/*.zip');

... чтобы все файлы заканчивались на .zip, но есть ли способ вернуть все файлы, которые не являются ZIP файлами?

Или нужно просто перебрать и отфильтровать их с помощью этого расширения?

Ответ 1

Я не думаю, что glob может сделать "не-подстановочный знак"...

Я вижу как минимум два других решения:

  • используйте комбинацию opendir/readdir/closedir
  • Или используйте некоторый Итератор SPL; Чтобы быть более конкретным, я думаю о DirectoryIterator; и, возможно, вы можете комбинировать его с некоторыми FilterIterator?

Ответ 2

Вы всегда можете попробовать что-то вроде этого:

$all = glob('/dir/somewhere/*.*');
$zip = glob('/dir/somewhere/*.zip');
$remaining = array_diff($all, $zip);

Хотя, используя один из других методов, упомянутый Паскаль может быть более эффективным.

Ответ 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