переименовывать файлы и каталоги {searchstr} с помощью {replacestr}

#perl #cygwin #batch-processing

#perl #cygwin #пакетная обработка

Вопрос:

У меня есть приложение (Templify), которое создает шаблонную структуру каталогов, но, похоже, оно не может переименовать «__NAME__» в то, что я определил как цель.

Это нормально, если я могу найти чистый способ переименовать все файлы и каталоги с моим текстом замены.

Я нашел rename.pl метод, который переименовывает файлы, и я нашел некоторый код, который удаляет подчеркивания в именах файлов и заменяет их пробелами… но когда я изменяю код, чтобы вставить мои условия поиска, кажется, что это никогда не работает.

Итак, в принципе, мне нужно заменить «__NAME__» чем-то вроде «Project-Name».

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

Я на XP и могу использовать cygwin (в cygwin, похоже, нет ‘rename’, что затрудняет поиск решений типа Linux с использованием функции под названием ‘rename’ ….)

Я нашел это, которое легко использовать для файлов в текущем каталоге, но я не знаю достаточно, чтобы указать ему рекурсию в подкаталоги.

Любая помощь была бы отличной.

Спасибо, Скотт

Комментарии:

1. Когда вы говорите «кажется, это никогда не работает», я хотел бы увидеть код, который вы пробовали. Вы получили сообщение об ошибке? Или просто ничего не произошло? Можете ли вы поделиться списком каталогов до и после?

2. Я просто имел в виду, что приложение, которое я использовал, запросило у меня название проекта, и введенное мной значение никогда не использовалось во вновь созданных каталогах. Я предположил, что каталоги и файлы с » ИМЕНЕМ » в них должны были быть заменены на то, что я ввел в качестве названия моего проекта.

Ответ №1:

Из cygwin:

 find /cygdrive/c/mytree -type f | perl -ne 'rename $_, $1/Project-Name if m[^(.*)/__NAME__$]'
  

Или с помощью python:

 import os

for root, dirs, files in os.walk("C:\mytree"):
    for filename in files:
        if filename == "__NAME__":
            os.rename(os.path.join(root, filename), os.path.join(root, "Project-Name"))
  

Комментарии:

1. спасибо, но я получил ошибку в версии cygwin: отсутствует запятая после первого аргумента для переименования функции в строке -e 1, рядом с «Name if». Где я должен поместить эту запятую? Спасибо.

2. Лучше добавить кавычки: rename $_, "$1/Project-Name"