glob() 是 PHP 內建的檔案模式匹配函數,配合 array_map() 與 unlink(),可用極簡潔的程式碼批量刪除檔案。
array_map('unlink', glob('*'));
glob('*'):回傳當前目錄下所有檔案/目錄名稱陣列array_map('unlink', ...):對陣列每個元素執行 unlink() 刪除glob(string $pattern, int $flags = 0): array|false
| 旗標 | 說明 |
|---|---|
GLOB_MARK | 目錄名稱加斜線 / 區分 |
GLOB_NOSORT | 不排序,依檔案系統原始順序(較快) |
GLOB_NOCHECK | 無匹配時回傳模式字串而非空陣列 |
GLOB_NOESCAPE | 反斜線不轉義,字面匹配 |
GLOB_BRACE | 展開 {a,b,c} 為多模式 |
GLOB_ONLYDIR | 僅回傳目錄 |
GLOB_ERR | 遇錯誤(如不可讀目錄)停止並回傳 false |
array_map('unlink', glob('*.log')); // 刪除所有 .log
array_map('unlink', glob('*.{jpg,png,gif}', GLOB_BRACE)); // 多副檔名
function rglob($pattern, $flags = 0) {
$files = glob($pattern, $flags);
foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) {
$files = array_merge($files, rglob($dir.'/'.basename($pattern), $flags));
}
return $files;
}
array_map('unlink', rglob('data/*'));
print_r(glob('*')); // 所有檔案/目錄
print_r(glob('*.txt')); // 所有 .txt
print_r(glob('*.*')); // 所有有副檔名
print_r(glob('*/*.php', GLOB_BRACE)); // 子目錄下所有 .php
glob('*') 包含隱藏檔、目錄,unlink() 刪除目錄會失敗但可能造成非預期結果*.tmp、cache_*),避免誤刪array_map 不會拋出異常,失敗靜默,建議改用 foreach 含 @unlink 或檢查回傳值foreach (glob('cache_*.tmp') as $file) {
if (is_file($file) && !unlink($file)) {
error_log("Failed to delete: $file");
}
}
glob() 是檔案系統操作的利器,善用模式匹配與旗標,能以極少代碼完成複雜的批量檔案操作。