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

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

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

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

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

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

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

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

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

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

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

Быстрое использование glob() для всего и использование preg_grep() для фильтрации файлов, которые вы не хотите.

 preg_grep('#\.zip$#', glob('/dir/somewhere/*'), PREG_GREP_INVERT) 

Также см. Шаблоны Глоба для сопоставления файлов в PHP

Эта модель будет работать:

 glob('/dir/somewhere/*.{?,??,[!z][!i][!p]*}', GLOB_BRACE); 

который находит все в / dir / where / end в точке, за которой следует либо

  • один символ ( ? )
  • или два символа ( ?? )
  • или ничего не начинающегося с последовательной буквы z, i, p ( [!z][!i][!p]* )
 $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