【问题标题】:Wildcard copy files in PHPPHP中的通配符复制文件
【发布时间】:2012-05-03 10:36:07
【问题描述】:

我想在 PHP 脚本中执行与以下 bash (shell) 命令等效的命令:

cp --parents -t ../../htdocs/host/$2/ *.html *.js *.png *.ogg *.mp3 Sprites/*.js

但是当我尝试使用 PHP system() 命令时,它不起作用,大概是因为 cp 是 shell 的一部分,而不是独立的可执行文件。而且我不认为 PHP copy() 函数支持通配符,或者如果支持,它肯定不支持我指定的命令行开关。在 PHP 中执行此操作的最简单和最好的方法是什么。我可以创建一个 shell 脚本并在其上调用 system() ,但这似乎是做作。

编辑: 评论正确;我相信我遇到了许可问题。为什么我对 mkdir("blahblah/htdocs/host/$REV", 775) 的调用没有将权限设置为所有者和组可写?

【问题讨论】:

  • 您是否检查了权限并在正确的目录中执行了此命令,您使用的是相对路径

标签: php linux bash command-line


【解决方案1】:

PHP 有一个接受通配符的glob() 函数。它不像 shell 行那么简单,但你可以这样做:

foreach (glob("*.html") as $htmlFile) {
    copy($htmlFile, $targetDir);
}

【讨论】:

  • 我是否必须“手动”/显式创建“Sprites”子目录?
  • 是的,PHP 中的 mkdir() 有一个选项,如果它已经存在则忽略它。这可能会为您节省几行代码。
【解决方案2】:

事实证明,正如评论所指出的,cp 确实不是 shell 的一部分,我认为错误与权限有关。当我运行mkdir 命令时,我不清楚如何设置目录权限,所以它不是所有者可写的。因此,除非有充分的理由不使用system() 函数,否则我可能会使用我现有的解决方案并更正我的mkdir 权限。

我的mkdir 已将 775 指定为模式,但由于我忽略了包含“0”前缀 (0775),我认为它被解释为十进制而不是八进制。纠正解决了一切。一个小角色就能产生很大的不同!

【讨论】:

  • 将 stderr 重定向到 stdout(将 2>&1 附加到命令的末尾),这样您就会看到 cp 失败的原因)。可能是因为权限或 CWD 错误。
  • @strkol 感谢您的提示;我已经想通了,这就是我能够在这里回答我的问题的方式。
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 2018-09-22
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多