Массовое удаление файлов из разных директорий на сервере.

Тема в разделе "PHP", создана пользователем manourr, 8 июл 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. manourr

    manourr Постоялец

    Регистр.:
    2 мар 2009
    Сообщения:
    78
    Симпатии:
    25
    С такой задачей ещё не сталкивался раньше и не совсем понимаю как решить.
    Суть такова. Есть текстовый файл-список, в котором построчно идут пути к разным файлам в разных папках на сервере. Примерно так:
    Код:
    administrator\components\com_typedcontent\index.html
    administrator\includes\js\ThemeOffice\index.html
    administrator\templates\mambo_admin\css\index.html
    components\com_messages\index.html
    components\com_newsfeeds\index.html
    components\com_poll\images\index.html
    components\com_registration\index.html
    Для примера список случайный. В настоящем расширения файлов могут быть разные. Нужно написать скрипт, которому можно скормить файл-список и он будет удалять эти файлы на сервере.
    Все соответствующие права у скрипта будут. Если нужно, то файл-список можно получить с полными путями к файлам.
     
  2. SolarWind

    SolarWind Создатель

    Регистр.:
    18 авг 2008
    Сообщения:
    42
    Симпатии:
    11
    Можно так:
    PHP:
    $files file('list.txt');
    foreach (
    $files as $file) {
        
    unlink(trim($file));
    }
    А если надо удалять независимо от того, файл это или директория, то можно написать так:
    PHP:
    <?php
    $files 
    file('list.txt');
    foreach (
    $files as $file) {
        
    Remove(trim($file));
    }

    function 
    Remove($path)
    {
        if (!
    file_exists($path)) return true;
        if (!
    is_dir($path)) return unlink($path);
        foreach (
    scandir($path) as $item) {
            if (
    $item == '.' || $item == '..') continue;
            if (!
    Remove($path.DIRECTORY_SEPARATOR.$item)) return false;
        }
        return 
    rmdir($path);
    }
    ?>
    Осторожно! Будет удалять вместе со всеми поддиректориями.
     
    manourr нравится это.
  3. manourr

    manourr Постоялец

    Регистр.:
    2 мар 2009
    Сообщения:
    78
    Симпатии:
    25
    Первый пример для меня. Я так же делал, вот только trim не ставил. Наверно поэтому и выдовалось предупреждение invalid argument для функции unlink. Слышал что есть ньюансы в работе unlink() в Виндовс и Никс. Насколько это так? На php.net весьма скудно описана функция.
     
  4. SolarWind

    SolarWind Создатель

    Регистр.:
    18 авг 2008
    Сообщения:
    42
    Симпатии:
    11
    Так же отличаются и такие вещи, как названия дисков "C:\ D:\" в windows, а в *nix системах все пути идут от корня, например "/etc"
    Отличается и разделитель, можно использовать константу PATH_SEPARATOR, но для большинства функций php, можно сразу использовать никсовые пути т.к. на платформах Windows в качестве разделителей имен директорий используются оба слэша (прямой / и обратный \).
    Так же могут пригодиться следующие функции:
    is_file($file) - определяет, является ли файл обычным файлом.
    chmod($file, 0666)- поставить права на чтение и запись, если конечно есть права, для выставления прав :D
    realpath($path) — возвращает канонизированный абсолютный путь к файлу
    можно использовать для приведения путей к windows стилю:
    realpath('/windows/system32') = C:\WINDOWS\System32
     
  5. manourr

    manourr Постоялец

    Регистр.:
    2 мар 2009
    Сообщения:
    78
    Симпатии:
    25
    Мда. Всё это очень просто чтобы быть правдой :(
    Код:
    Warning: chmod() [function.chmod]: Operation not permitted in /var/www/.......te.php on line 8
    Warning: unlink(/var/www/... qp.html) [function.unlink]: Permission denied in /var/www/.......te.php on line 9
    Хотя странно, права должны быть. Может быть можно всё это реализовать через ftp wraper? Но тут я вобще не представляю, как это делается. Если кто-то подскажет, буду очень благодарен.
     
  6. SolarWind

    SolarWind Создатель

    Регистр.:
    18 авг 2008
    Сообщения:
    42
    Симпатии:
    11
    Да проблема именно с правами...
    Возможно права на запись стоят, но только для другого пользователя, тогда можно пользоваться функцией chown, для смены владельца.
    Так же файл может быть уже кем-то открыт в настоящий момент (например другим скриптом), тогда предварительно он должен быть закрыт.
    Права на использование chmod дают далеко не на всех серверах.

    Удалять через фтп можно и без врапера, чисто средствами php:
    PHP:
    <?php
    $file 
    'путь к удаляемому файлу';

    // устанавливаем соединение
    $conn_id ftp_connect($ftp_server);

    // логинимся
    $login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass);

    // попытка изменить права доступа к файлу $file на 644
    if (ftp_chmod($conn_id0666$file) !== false) {
     echo 
    "Права доступа к файлу $file изменены на 666\n";
    } else {
     echo 
    "Не удалось изменить права доступа к файлу $file\n";
    }

    // пробуем удалить
    if (ftp_delete($conn_id$file)) {
     echo 
    "файл $file удален\n";
    } else {
     echo 
    "невозможно удалить файл: $file\n";
    }

    ftp_close($conn_id);
    ?>
     
  7. manourr

    manourr Постоялец

    Регистр.:
    2 мар 2009
    Сообщения:
    78
    Симпатии:
    25
    Да, так и сделал. Почитал на ПХП.нет, там нормально расписано. Права на файлы не менял, а просто удалил.
    PHP:
    $conn_id=ftp_connect($ftp_server);
    $login_result=ftp_login($conn_id$ftp_user_name$ftp_user_pass);
    if(
    $login_result) echo 'Connected.<hr><br>';
    $pathes=file('files_to_delete.txt');
    foreach (
    $pathes as $path)
    {
        
    $path=trim($path);
        if(
    ftp_delete($conn_id$path))
        {
            echo 
    'Deleted -> '.$path.'<br>';
        }
    }
    ftp_close($conn_id); 
    Но, все-таки, это не совсем как-то правильно. Через скрипт сервер конектится сам к себе. Ну, раз другого способа нет, то и этот пойдёт. Спасибо за ответы. Теперь на повестке дня замена файлов по таким же спискам. Но тут, думаю, уже разберусь.
     
  8. hipachka

    hipachka

    Регистр.:
    16 мар 2009
    Сообщения:
    391
    Симпатии:
    77
    Я так понял это для борьбы с вирусами типо FRAME. Как доделаете скрипт выложите пожалуйста очень интересно взглянуть ;)

    Как вариант - можно попробовать покилять файлы по дате изменения...
     
  9. manourr

    manourr Постоялец

    Регистр.:
    2 мар 2009
    Сообщения:
    78
    Симпатии:
    25
    Как раз только сегодня узнал зачем это нужно. Раньше полной информации не имел. Действительно, как заметил hipachka, всё это действо было направлено на удаление и чистку файлов, в которых был iframe. По дате не получится, т.к. она практически не вызывает подозрения.
    Единого скрипта по борьбе с этой какой нету. Есть некий комплекс мер из разных скриптов и локальных действий. Если интересно могу расписать их чуть подробнее. Но не сейчас, так как сам не владею всей информацией, а завтра-послезавтра.
     
  10. ConstNW

    ConstNW Постоялец

    Регистр.:
    30 июн 2007
    Сообщения:
    132
    Симпатии:
    39
    если речь идет о файле-списке, то в шеле просто:
    Код:
    xargs rm < file.txt
    имхо, это удобнее и проще, чем держать какой-то специальный скрипт.
     
    venetu нравится это.
Статус темы:
Закрыта.