Kraplax 24.05.2009 06:37
На заказ — Нужен скрипт для копирования файлов по списку из файла
Так как существует такой блог, значит есть добровольцы, которые его создали. А это значит что есть шанс получить здесь помощь ;-)Предыстория
Некоторым не нравится способ распространения программ KDE на Windows. Все дело в том, что в нем используется принцип репозиториев, как и в Linux. Однако многим было бы удобнее скачать установщик того же Amarok одним файлом и поставить только его в отдельную от KDE папку. Это все реализуемо, конечно, если делать через тот же установщик и просто установить в другую папку, но тут есть два аспекта - офф-лайн режим все еще в тестовой стадии, а зависимости тянутся целыми пакетами. А для создания установщика самое главное - это собрать все файлы, которые используются приложением и упаковать их. Для создания списка используемых файлов была взята утилита Process Monitor. Логи сохранены в файл и... собственно тут подходим к сути.
Суть
Нужен скрипт, который бы читал построчно файл, в котором несколько тысяч строк (множественные дубликаты), каждая строка - полный путь к папке или файлу. Скрипт должен копировать файл в указанную директорию с воссозданием иерархии файлов и папок.
Основные моменты, которые следует учесть:
файлы повторяются, потому нужна проверка на существование файла/папки в пункте назначения
файл из списка может отсутствовать - нужна проверка на существование в исходном виде
файлы и папки должны повторять иерархию. Если в списке будет файл C:\KDE\share\icons\oxygen\16x16\actions\foo.png, то копироваться он должен в D:\CUSTOM_ROOT\share\icons\oxygen\16x16\actions\foo.png, а не просто D:\CUSTOM_ROOT\foo.png!
Не стоит заморачиваться с начальной частью полного пути файла в списке исходных файлов - в любом текстовом редакторе можно сделать замену того же C:\Program files\KDE на что-то вроде KDEROOT для более удобной работы скрипта
язык скрипт может быть любой - питон, яваскрипт, VBскрипт, Bash, Batch - все что угодно, я найду способ его запустить (Barinfuck не предлагать :P)
такие параметры как корневая папка KDE или папка назначения могут быть, что называется, hardcoded, если вам так удобно, но все же приветствуется хотя бы какая-то возможность подстановки своих значений
Скриптописатель из меня не очень-то хороший, в жабере друзей таких же тоже немного, поэтому решил что здесь будет удобнее спросить. Если считаете тему неуместной - минусуйте. Готовый скрипт, наверное, лучше выкладывать в блоге Скрипты на bash (если скрипт действительно будет на bash), или кидать мне в личку/мыло/жабер (для потомков я его все равно к этому посту потом прилеплю).
Чтоб создавать папки:
Или как-то так. Опять же, с виндой придется переиначить немного - все экранированные слеши поменять на экранированные бэкслеши.
for folder in `cat files.log | uniq | sed -e "s/^$OLDPATH\(.*\)/\1/" | sed -e "s/^\(\(.*\/\)*\)<^\/>*$/\1/" | uniq`; do mkdir -p "$NEWPATH"$folder; done
Или как-то так. Опять же, с виндой придется переиначить немного - все экранированные слеши поменять на экранированные бэкслеши.
А эти два куска как запускать? по очереди? и какой тут первым лучше?
Нельзя ли обьединить их под одной крышкой?
Нельзя ли обьединить их под одной крышкой?
Сначала структуру директорий создать (то есть второй), потом - скопировать файлы (то есть первый). И, да, во втором скрипте тоже должно быть объявление переменных.
Можно загнать и в один скрипт. Тогда сначала должно быть объявление переменных, потом - создание директорий, потом - копирование файлов.
Алсо, я не уверен, что оно работает так, как надо: это всего лишь эскиз.
Можно загнать и в один скрипт. Тогда сначала должно быть объявление переменных, потом - создание директорий, потом - копирование файлов.
Алсо, я не уверен, что оно работает так, как надо: это всего лишь эскиз.
Даже за это уже спасибо. Если еще разберусь с принципом работы (у меня тяжко с регулярными выражениями разного рода), то вообще будет расчудесно.
Написать, конечно, можно, но зачем столько проблем?
Не проще ли предварительно сжать всё в архив tar'ом, используя KDE_ROOT в качестве корня, а потом точьно так же всё установить? Это стандартный, проверенный метод, используемый во всех пакетных менеджерах и инсталляторах. И работать это будет быстрее, чем обработка тысяч строк текстового файла, со всякими заменами и отдельными созданиями директорий/копирования файлов.
Не проще ли предварительно сжать всё в архив tar'ом, используя KDE_ROOT в качестве корня, а потом точьно так же всё установить? Это стандартный, проверенный метод, используемый во всех пакетных менеджерах и инсталляторах. И работать это будет быстрее, чем обработка тысяч строк текстового файла, со всякими заменами и отдельными созданиями директорий/копирования файлов.
uniq - подает на вывод очищенный от повторений ввод
sed -e "s/^$OLDPATH\(.*\)/\1/" - даст относительные пути по абсолютным
тогда все вместе будет выглядеть как-то так:
$OLDPATH="\/usr\/"
$NEWPATH="\/home\/user\/"
for file in `cat files.log | uniq | sed -e "s/^$OLDPATH\(.*\)/\1/"`; do
cp "$OLDPATH"$file "$NEWPATH"$file; done
Пока не проверял. Тут есть пара узких мест:
1) Нужно, чтобы sed получил пути $OLDPATH и $NEWPATH уже экранированными, как я и сделал. Кстати, cp экранированные пути вроде понимает.
2) Структура директорий не создается. Для этого лучше сделать отдельный скрипт с использованием всё того же uniq | sed -e "..." и mkdir -p
3) У винды, мб, есть своя специфика.
Сорри, сейчас доделать возможности нет - сессия подкралась )