Начало: «
GitHub: переименование множества файлов в репозитории».
В
предыдущем посте я писал, что при переименовании множества файлов в репозитории у меня не получилось использовать команду
git mv, так как в ней нет возможности использовать регулярные выражения, можно использовать только символы-джокеры, а этого недостаточно.
Мне
посоветовали конструировать команду git mv строкой, в цикле добавляя в нее нужные параметры (так я понял). Таким образом можно обойти вышеупомянутое ограничение команды git mv и таки использовать для нее регулярные выражения. Автор совета написал пример скрипта для программы-оболочки «
bash», но мне было интересно попробовать переписать понятое мною на языке PowerShell.
В результате у меня получился следующий скрипт:
файл «rename-files.ps1» (в кодировке UTF-8 без BOM, окончания строк CRLF)
Get-ChildItem -File -Recurse |
ForEach-Object {
$old = $_.Name
$new = $old -replace '^(\d\d)-(\d\d)_(.*)', '$1-0$2_$3'
if ($old -ne $new) {
$path = $_.DirectoryName
Invoke-Expression "git mv $path\$old $path\$new"
}
}
Во второй строке скрипта я заменил командлет «Rename-Item» на командлет «
ForEach-Object», который получает по конвейеру | отобранные файлы от командлета «Get-ChildItem» и обрабатывает их один за другим.
Нужная команда git mv для каждого полученного командлетом «ForEach-Object» файла конструируется в виде строки и запускается с помощью командлета «
Invoke-Expression». С помощью условия в скрипте я сделал так, что команда git mv запускается только для файлов, которые подпадают под указанный с помощью регулярного выражения шаблон, и только для файлов, имя которых действительно будет изменено.
Команда git mv не смотрит внутрь вложенных папок, поэтому для передаваемых ей имен файлов требуется указывать полный путь к файлу, иначе эта команда может файл не найти, если он находится в подпапках, и выдать ошибку.
Вышеприведенный скрипт я немного потестировал, и он у меня работает успешно. При этом теперь отпадает необходимость в команде, формирующей индекс для последующего коммита в Git-репозиторий. После команды git mv можно сразу выполнять коммит со множественным переименованием файлов.