GitHub: переименование множества файлов в репозитории 2 (git mv)

Jul 03, 2023 13:27

Начало: « 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 можно сразу выполнять коммит со множественным переименованием файлов.

Инструмент, Образование, Программирование

Previous post Next post
Up