Как скопировать много файлов с сохранением относительных путей...
Для автоматической замены строк в большом количестве файлов, расположенных в большом количестве вложенных папок (например, на сделанном по шаблону статическом сайте, в котором вдруг понадобилось убрать ссылку со всех страниц) удобно использовать старенькую программу 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 просмотра]