【问题标题】:Delete files on a FTP server with the word "ub" in their filenames删除文件名中包含“ub”字样的 FTP 服务器上的文件
【发布时间】:2011-09-18 17:43:46
【问题描述】:

我通过 ftp_connectftp_login 连接到 FTP 服务器。连接后,我会转到带有ftp_chdir 的目录。在目录中,我必须用ftp_delete 删除所有文件名中包含“ub”字样的文件。所以我必须以某种方式读取每个文件名并只删除那些文件名中包含“ub”的文件。我不知道该怎么做。请帮忙。谢谢。

【问题讨论】:

  • 你快到了 :) 见ftp_nlist:php.net/manual/en/function.ftp-nlist.php
  • 谢谢!获得目录中包含的文件列表后,如何仅删除文件名中带有“ub”字样的文件?
  • 使用 strpospreg_match 或任何其他对此类事情有用的函数。

标签: php ftp


【解决方案1】:

如果您使用交互式 ftp 命令行工具,您可以发出命令

mdel *ub*

但是底层协议不支持通配符操作;正如您所说,这是必须通过获取所有名称,与模式进行比较并逐个删除来在客户端中实现的东西。您可能想考虑使用命令行 ftp 编写脚本,而不是使用 php?

【讨论】:

    【解决方案2】:

    @Pekka 的评论有一种可能的解决方案。另一个正在使用glob

    $files = glob('*ub*');
    

    【讨论】:

    • 只有当 ftp 服务器 OP 尝试连接在运行 php 脚本的同一台机器上时,这才是正确的
    【解决方案3】:
    foreach (glob("*ub*") as $file) {
        ftp_delete('YOUR_CONNECTION', $file);
    }
    

    问候

    【讨论】:

      【解决方案4】:

      由于这个问题没有真正的答案,我将使用允许通过 ftp 删除多个文件的函数来回答:

      /**
       * Delete multiple files on FTP server. Allowed wildcards are * and ?.
       * @param resource $ftp_connection
       * @param string $delete_pattern
       * @param bool $case_sensitive Case sensitivity is by default
       * @return bool|int Number of deleted files, FALSE on failure
       */
      function ftp_mdelete($ftp_connection, $delete_pattern = "", $case_sensitive = TRUE){
          if(!is_resource($ftp_connection) || strtolower(get_resource_type($ftp_connection)) !== "ftp buffer"){
              trigger_error("First parameter for ftp_mdelete should be a valid FTP connection", E_USER_WARNING);
              return FALSE;
          }elseif(!is_string($delete_pattern) || !strlen($delete_pattern)){
              trigger_error("Second parameter for ftp_mdelete should be a non-empty string", E_USER_WARNING);
              return FALSE;
          }
          $raw_list = ftp_rawlist($ftp_connection, '.');
          if(!is_array($raw_list)){
              return FALSE;
          }
          $matched_count = 0;
          $deleted_count = 0;
          if($raw_list){
              $delete_pattern = preg_quote($delete_pattern);
              $delete_pattern = '/^'.str_replace(array('\*', '\?'), array('.*', '.'), $delete_pattern).'/S'.($case_sensitive?'':'i');
              foreach($raw_list as $entry){
                  if($entry{0} === '-'){
                      $entry = preg_split("/[\s]+/S", $entry, 9);
                      $entry = $entry[8];
                      if(preg_match($delete_pattern, $entry)){
                          ++$matched_count;
                          if(ftp_delete($ftp_connection, $entry)){
                              ++$deleted_count;
                          }
                      }
                  }
              }
              unset($raw_list, $entry);
          }
          if($matched_count != $deleted_count && $deleted_count){
              trigger_error("Only {$deleted_count} out of {$matched_count} files deleted.", E_USER_NOTICE);
          }elseif($matched_count && !$deleted_count){
              trigger_error("No files were deleted ({$matched_count} files matched given pattern).", E_USER_WARNING);
              return FALSE;
          }
          return $deleted_count;
      }
      

      使用示例:

      $ftp = ftp_connect('127.0.0.1');
      ftp_login($ftp, 'user', 'pass');
      ftp_chdir($ftp, 'dir');
      $deleted = ftp_mdelete($ftp, '*ub*');
      ftp_close($ftp);
      
      echo "Number of deleted files: ".intval($deleted);
      

      【讨论】:

        最近更新 更多