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 ./ ./