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

Статус
В этой теме нельзя размещать новые ответы.

manourr

Постоялец
Регистрация
2 Мар 2009
Сообщения
76
Реакции
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
Для примера список случайный. В настоящем расширения файлов могут быть разные. Нужно написать скрипт, которому можно скормить файл-список и он будет удалять эти файлы на сервере.
Все соответствующие права у скрипта будут. Если нужно, то файл-список можно получить с полными путями к файлам.
 
Можно так:
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);
}
?>
Осторожно! Будет удалять вместе со всеми поддиректориями.
 
Первый пример для меня. Я так же делал, вот только trim не ставил. Наверно поэтому и выдовалось предупреждение invalid argument для функции unlink. Слышал что есть ньюансы в работе unlink() в Виндовс и Никс. Насколько это так? На php.net весьма скудно описана функция.
 
В Unix-системах нет операции удаления файла в том смысле, какой существует в Windows. Есть только удаление ссылки на узел - unlink - и ссылки на пустой каталог - rmdir. Сам же файл автоматически удаляется тогда, когда делается недоступным для системы. Это означает, что не должно остаться, во-первых, ни одной ссылки на него, а во-вторых, ни одной работающей с ним активной программы.
Так же отличаются и такие вещи, как названия дисков "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
 
Мда. Всё это очень просто чтобы быть правдой :(
Код:
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? Но тут я вобще не представляю, как это делается. Если кто-то подскажет, буду очень благодарен.
 
Да проблема именно с правами...
Возможно права на запись стоят, но только для другого пользователя, тогда можно пользоваться функцией 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_id, 0666, $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);
?>
 
Да, так и сделал. Почитал на ПХП.нет, там нормально расписано. Права на файлы не менял, а просто удалил.
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);
Но, все-таки, это не совсем как-то правильно. Через скрипт сервер конектится сам к себе. Ну, раз другого способа нет, то и этот пойдёт. Спасибо за ответы. Теперь на повестке дня замена файлов по таким же спискам. Но тут, думаю, уже разберусь.
 
Я так понял это для борьбы с вирусами типо FRAME. Как доделаете скрипт выложите пожалуйста очень интересно взглянуть ;)

Как вариант - можно попробовать покилять файлы по дате изменения...
 
Как раз только сегодня узнал зачем это нужно. Раньше полной информации не имел. Действительно, как заметил hipachka, всё это действо было направлено на удаление и чистку файлов, в которых был iframe. По дате не получится, т.к. она практически не вызывает подозрения.
Единого скрипта по борьбе с этой какой нету. Есть некий комплекс мер из разных скриптов и локальных действий. Если интересно могу расписать их чуть подробнее. Но не сейчас, так как сам не владею всей информацией, а завтра-послезавтра.
 
если речь идет о файле-списке, то в шеле просто:
Код:
xargs rm < file.txt
имхо, это удобнее и проще, чем держать какой-то специальный скрипт.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху