Ubuntu下PHP 8中如何利用glob输出进入含空格的目录?
解决带空格目录的exec执行问题
方法1:用escapeshellarg()转义目录名
这是最安全的处理方式,PHP的escapeshellarg()会自动把带空格(或特殊字符)的路径转成Shell能识别的格式,避免路径被拆分成多个参数。修改代码如下:
foreach ($directories as $dir) { echo "Directory: $dir\n"; // 注意:exec启动的Shell进程里,cd只对当前进程生效,后续命令要通过&&串联 exec('cd ' . escapeshellarg($dir) . ' && 你的缩略图生成命令'); }
该函数会自动给目录名添加单引号或转义特殊字符,让Shell正确识别完整路径。
方法2:直接用PHP遍历文件,跳过exec切换目录
其实完全不需要依赖Shell的cd命令,PHP本身就能直接遍历子目录里的MP4文件,从根源上避开路径空格问题:
$directory = '.'; $directories = glob($directory . '/*', GLOB_ONLYDIR); foreach ($directories as $dir) { echo "Directory: $dir\n"; // 直接查找当前子目录下的所有MP4文件 $mp4Files = glob($dir . '/*.mp4'); foreach ($mp4Files as $file) { // 处理单个文件时,同样用escapeshellarg转义路径 exec('ffmpeg -i ' . escapeshellarg($file) . ' -vframes 1 ' . escapeshellarg($file . '.jpg')); } }
这种方式更稳定安全,还能直接获取所有目标文件的路径,方便后续批量处理。
方法3:手动用双引号包裹路径(不推荐)
如果临时应急,可以把目录名用双引号括起来,让Shell将整个路径视为单个参数:
exec('cd "' . $dir . '" && 你的命令');
但这种方式存在风险,若目录名包含双引号(虽少见),会直接导致命令执行失败,因此优先推荐前两种方法。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

