БлогNot. Как скопировать много файлов с сохранением относительных путей...

Как скопировать много файлов с сохранением относительных путей...

Для автоматической замены строк в большом количестве файлов, расположенных в большом количестве вложенных папок (например, на сделанном по шаблону статическом сайте, в котором вдруг понадобилось убрать ссылку со всех страниц) удобно использовать старенькую программу Replacer, которая легко справится с этой задачей для кодировки Windows, DOS или KOI-8R. Так как сайт программы больше не доступен, вот она в архиве ZIP, установка не нужна:

 Скачать Replacer 1.7 в архиве ZIP (183 Кб)

Конечно, до замены нужно с помощью Far Manager составить список изменяемых файлов и сохранить его:

  • перейти в корневую папку локальной копии сайта, нажать Alt+F7, найти все файлы, содержащие нужную строку (поиск с текущей папки) и вывести их во временную панель (кнопка Панель в окне поиска);
  • во временной панели нажать Alt+Shift+F2 и сохранить её содержимое как список файлов (будет предложено это сделать в папку, открытую во второй панели).

После замены нужной строки имеем массу разбросанных по разным папкам файлов, теперь нужно их куда-то переписать, чтобы затем залить по FTP на сайт (встроенный в Far клиент FTP прекрасно справляется с сохранением относительных путей при копировании, но не "заливать" же все сотни мегабайт заново, вместо 5-10 мегабайт изменённых текстов).

Я не стал искать плагин для Far'а, который позволит корректно скопировать содержимое временной панели, проще оказалось быстро написать нужный код на PHP.

Сначала сохранённый по Alt+Shift+F2 файл я перекодировал в ANSI из непонятно чего с помощью Notepad++ (почему-то Shift+F8 - выбор кодировки - на этом файле из Far не работал), затем создал на локальном хосте новую папку, поставил права 777 на папку со скриптом на локалхосте (пункт 3 и тут). Если файл со списком называется 1.txt и лежит в одной папке со скриптом, скрипт может выглядеть так:

<?php
echo '<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Скопировать файлы по списку с сохранением структуры папок</title>
</head><body><pre>';

$path="D:/NICK/HTML/pers.narod.ru/"; //Общая часть путей, лучше с прямым слешем, а не обратным и слеш в конце
 
$lines = file('1.txt');
$ok=$bad=$all=0;
$error='';
foreach ($lines as $line) {
 $line=rtrim($line);
 $line=str_replace ('\\','/',$line); //Заменяем слеши на обратные

 $nextfile = explode("$path", $line);
 $filename= substr(strrchr ($nextfile[1],'/'),1); //Имя файла без слеша в начале
 if (empty($filename)) $filename=$nextfile[1];
 $filepath=array();
 if ($filename!=$nextfile[1]) $filepath= explode("$filename", $nextfile[1]);
 else $filepath[0]='./'; //Путь к файлу - или текущая папка, если в корневой папке поддерева
 if (!is_dir($filepath[0])) @mkdir($filepath[0]); //Если папка ещё не создана - создать
 if (!@copy($line,$filepath[0].$filename)) {
  $error.=$line.'<br>';
  $bad++;
 }
 else $ok++;
 $all++;
 //echo ' '.$filepath[0].' '.$filename.'<br>';
}
echo '<p>Всего обработано файлов из списка: '.$all; 
echo '<p>Успешно скопировано: '.$ok; 
echo '<p>Ошибок: '.$bad.'<br>'.$error; 
echo '</pre></body></html>';
?>

Здесь структура папок создаётся непосредственно в папке скрипта. По неизвестной причине пара глубоко вложенных папок не создалась (список не скопированных файлов скрипт выводит в окно браузера), проблем с функцией copy не нашёл, ошибка "путь не найден" шла от mkdir, просто "досоздал" эти папки вручную, после чего в них скопировались нужные файлы.

Потом мне осталось залить файлы из папки скрипта по FTP на сайт.

Наверняка есть способы лучше, например, должен быть подобный плагин для Total Commander - но ставить ради этого Total поленился...

07.02.2013, 12:08 [15824 просмотра]


теги: список софт php ftp

К этой статье пока нет комментариев, Ваш будет первым