glob()とscandir()の比較

  • glob()で「.」始まりのファイルが含まれてなかったので確認
  • ファイルはこんな感じ
# ls -alU /tmp/filelist/
合計 200
drwxr-xr-x 3 root root   4096  6月  8 10:39 .
drwxrwxrwx 5 root root 192512  6月  8 10:39 ..
-rw-r--r-- 1 root root      2  6月  8 10:39 file_a
-rw-r--r-- 1 root root      2  6月  8 10:39 .file_b
drwxr-xr-x 2 root root   4096  6月  8 10:39 dir_a
  • ソース
var_dump(glob("/tmp/filelist/*"));
var_dump(glob("/tmp/filelist/.*"));
var_dump(scandir("/tmp/filelist/"));
  • 結果
array(2) {
  [0]=>
  string(19) "/tmp/filelist/dir_a"
  [1]=>
  string(20) "/tmp/filelist/file_a"
}
array(3) {
  [0]=>
  string(15) "/tmp/filelist/."
  [1]=>
  string(16) "/tmp/filelist/.."
  [2]=>
  string(21) "/tmp/filelist/.file_b"
}
array(5) {
  [0]=>
  string(1) "."
  [1]=>
  string(2) ".."
  [2]=>
  string(7) ".file_b"
  [3]=>
  string(5) "dir_a"
  [4]=>
  string(6) "file_a"
}

glob()の動き

  • GLOB_BRACE でまとめて抽出できるらしいが
var_dump(glob("/tmp/filelist/{*,.*}", GLOB_BRACE));
  • ソートされてないというか2回処理して結果をマージ?
array(5) {
  [0]=>
  string(19) "/tmp/filelist/dir_a"
  [1]=>
  string(20) "/tmp/filelist/file_a"
  [2]=>
  string(15) "/tmp/filelist/."
  [3]=>
  string(16) "/tmp/filelist/.."
  [4]=>
  string(21) "/tmp/filelist/.file_b"
}
  • 同じパターンを並べてみると
var_dump(glob("/tmp/filelist/{*,*}", GLOB_BRACE));
  • そうなるか
array(4) {
  [0]=>
  string(19) "/tmp/filelist/dir_a"
  [1]=>
  string(20) "/tmp/filelist/file_a"
  [2]=>
  string(19) "/tmp/filelist/dir_a"
  [3]=>
  string(20) "/tmp/filelist/file_a"
}
  • ソートされてる風にするには「.*」を先にもってくる
var_dump(glob("/tmp/filelist/{.*,*}", GLOB_BRACE));
  • scandir()と同じ並びになった
array(5) {
  [0]=>
  string(15) "/tmp/filelist/."
  [1]=>
  string(16) "/tmp/filelist/.."
  [2]=>
  string(21) "/tmp/filelist/.file_b"
  [3]=>
  string(19) "/tmp/filelist/dir_a"
  [4]=>
  string(20) "/tmp/filelist/file_a"
}
  • GLOB_NOSORTとの組み合わせ
var_dump(glob("/tmp/filelist/{.*,*}", GLOB_BRACE | GLOB_NOSORT));
var_dump(scandir("/tmp/filelist/", SCANDIR_SORT_NONE));
  • 「ソートしない」だからどうでもいいけど、scandirとは一致しない
array(5) {
  [0]=>
  string(15) "/tmp/filelist/."
  [1]=>
  string(16) "/tmp/filelist/.."
  [2]=>
  string(21) "/tmp/filelist/.file_b"
  [3]=>
  string(20) "/tmp/filelist/file_a"
  [4]=>
  string(19) "/tmp/filelist/dir_a"
}
array(5) {
  [0]=>
  string(1) "."
  [1]=>
  string(2) ".."
  [2]=>
  string(6) "file_a"
  [3]=>
  string(7) ".file_b"
  [4]=>
  string(5) "dir_a"
}

  • Prev
  • Next