HomeBlogMagic

Powershell move multiple files in git

Manchmal möchte man mehrere Dateien innerhalb eines Git Repositories verschieben. Dazu ist es manchmal leichter eine Scriptsprache dafür zu benutzen. Gerade wenn man mit Wildcards arbeitet, oder arbeiten möchte, sind Scriptsprachen deutlich im Vorteil.

Ich habe mich in diesem Fall für Powershell entschieden da ich das gerade zur Hand hatte, aber die folgende Funktion liese sich Problemlos auch mit anderen Sprachen realisieren:

function GitMvToDir($sSourcePath, $sTargetDir)
{
    $oFiles = Get-ChildItem $sSourcePath
    foreach($oFile in $oFiles)
    {
        $sFilePath = $oFile.FullName
        $sFileName = $oFile.Name
        $sTargetPath = $sTargetDir
        if($sTargetPath.EndsWith("/") -or $sTargetPath.EndsWith("\"))
        {
            $sTargetPath += $sFileName
        }
        else
        {
            $sTargetPath += "/"
            $sTargetPath += $sFileName
        }
        git mv "$sFilePath" "$sTargetPath"
    }
}

Mit dieser Funktion kann man einen beliebigen Wildcard-Pfad mehrere Dateien in ein anderes Verzeichnis schieben.

Beispiel:

GitMvToDir *.h ../..

Mit diesem Aufruf werden alle .h Dateien im GitRepositorie zwei Ordner nach oben verschoben.

Funktion mit Filter

Eben habe ich die Funktion mit einem Filter gebraucht und diese entsprechend angepasst:

function GitMvToDir($sSourcePath, $sTargetDir, $sExclude)
{
    $oFiles = Get-ChildItem $sSourcePath
    foreach($oFile in $oFiles)
    {
        $sFilePath = $oFile.FullName
        $sFileName = $oFile.Name
        $sTargetPath = $sTargetDir
        if($sTargetPath.StartsWith($sExclude))
        {
        }
        else
        {
            if($sTargetPath.EndsWith("/") -or $sTargetPath.EndsWith("\"))
            {
                $sTargetPath += $sFileName
            }
            else
            {
                $sTargetPath += "/"
                $sTargetPath += $sFileName
            }
            git mv "$sFilePath" "$sTargetPath"
        }
    }
}

Funktion um Dateien mit replace umzubenennen

In diesem Beispiel werden alle Dateien die Webpage im Namen beinhalten verkürzt zu Web

function GitMvToDir($sSourcePath, $sTargetDir)
{
    $oFiles = Get-ChildItem $sSourcePath
    $oTarget = Get-Item $sTargetDir
    foreach($oFile in $oFiles)
    {
        $sFilePath = $oFile.FullName
        $sFileName = $oFile.Name
        $sTargetPath = $oTarget.FullName

        $sTargetName = $sFileName.Replace("Webpage", "Web");
        $sTargetPath = $sTargetPath + "/" + $sTargetName

        if($sFilePath -ne $sTargetPath)
        {
            git mv "$sFilePath" "$sTargetPath"
        }
    }
}

# Call the function in current directory
GitMvToDir ./ ./
Permalink: https://adirmeier.de/Blog/ID_288
Tags: Blog, git, Powershell, windowsvon am 2019-11-13