Удалите файлы на FTP-сервере со словом «ub» в именах файлов - PullRequest
0 голосов
/ 18 сентября 2011

Я подключаюсь через ftp_connect и ftp_login к FTP-серверу. После подключения я иду в каталог с ftp_chdir. В каталоге я должен удалить с помощью ftp_delete все файлы, в названии которых есть слово «ub». Поэтому я должен как-то прочитать каждое имя файла и удалить только те файлы, в имени которых есть «ub». Я понятия не имею, как это сделать. Пожалуйста помоги. Спасибо.

Ответы [ 4 ]

0 голосов
/ 20 сентября 2011

Поскольку на этот вопрос нет реального ответа, я отвечу своими функциями, которые позволяют удалять несколько файлов по 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);
0 голосов
/ 18 сентября 2011

@ Комментарий Пекки имеет одно из возможных решений.Другой использует glob.

$files = glob('*ub*');
0 голосов
/ 18 сентября 2011
foreach (glob("*ub*") as $file) {
    ftp_delete('YOUR_CONNECTION', $file);
}

С уважением

0 голосов
/ 18 сентября 2011

Если вы используете интерактивный инструмент командной строки ftp, вы можете выполнить команду

mdel *ub*

, но протокол низкого уровня не поддерживает операции с подстановочными знаками;это то, что должно быть реализовано в клиенте путем извлечения всех имен, сравнения с шаблоном и удаления одного за другим, как вы сказали.Возможно, вы захотите написать сценарий с помощью командной строки ftp, а не с помощью php?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...