117471
20.11.2014, aktualisiert um 10:13:31 Uhr
4993
6
0
Dupes mit anderem Dateinamen finden und in "HardLinks" umwandeln (W2k12R2, NTFS)
Ich war gestern bei einem Architekten. Auf seinem Filer liegen tausende von Fotos. Es gibt viele Fotos, die doppelt (dreifach, vierfach) unter unterschiedlichen Dateinamen in verschiedenen Ordnern liegen.
Was er sich vorstellt:
- die Dupes finden
- die Dupes durch eine Art "Hardlink" zu ersetzen
Unter Linux ließe sich so etwas meines Erachtens nach schnell basteln. Aber sein neuer Filer wird definitiv ein SBS2012R2 und ein zweiter Server kommt absolut nicht in die Tüte (auch nicht als VM).
Mit dem Argument, dass Speicherplatz heutzutage nichts mehr kostet, konnte ich Ihn auch nicht ködern (Monk...) ---> Tonne.
Ich habe mir auch schon überlegt, eine Datenbank zu etablieren, bei der er die Informationen aus den Datennamen in den Index reinklötert. Allerdings besteht das Problem, dass in den Dateinamen META-Informationen stehen, die an anderer Stelle (beim Empfänger) ausgewertet werden. Sprich - ich würde damit bei knapp 1000 Geschäftspartnern "in den Prozessen rühren". Man könnte zwar etwas "richtig Geiles" mit einer Exportfunktion bauen, allerdings ist das Budget begrenzt ---> Tonne.
Gibt es irgendeine günstige und knackige Lösung, mit dem ich ihn "verarzten" kann?
Was er sich vorstellt:
- die Dupes finden
- die Dupes durch eine Art "Hardlink" zu ersetzen
Unter Linux ließe sich so etwas meines Erachtens nach schnell basteln. Aber sein neuer Filer wird definitiv ein SBS2012R2 und ein zweiter Server kommt absolut nicht in die Tüte (auch nicht als VM).
Mit dem Argument, dass Speicherplatz heutzutage nichts mehr kostet, konnte ich Ihn auch nicht ködern (Monk...) ---> Tonne.
Ich habe mir auch schon überlegt, eine Datenbank zu etablieren, bei der er die Informationen aus den Datennamen in den Index reinklötert. Allerdings besteht das Problem, dass in den Dateinamen META-Informationen stehen, die an anderer Stelle (beim Empfänger) ausgewertet werden. Sprich - ich würde damit bei knapp 1000 Geschäftspartnern "in den Prozessen rühren". Man könnte zwar etwas "richtig Geiles" mit einer Exportfunktion bauen, allerdings ist das Budget begrenzt ---> Tonne.
Gibt es irgendeine günstige und knackige Lösung, mit dem ich ihn "verarzten" kann?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 255383
Url: https://administrator.de/contentid/255383
Ausgedruckt am: 22.11.2024 um 12:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo FA-jka,
ein Tool was Deine Anforderungen umsetzt kenne ich nicht, würde ich aber auch gerne haben.
Eine alternative Lösung wäre es das Filesystem als Deduplicationsspeicher einzurichten. Die Deduplication ist in Windows 2012 integriert und muss nur als Rolle hinzugefügt werden.
Werden die Daten auf dem Filesystem dedupliziert ist es egal, wie oft man das Bild oder die Datei abspeichert, Da die Dedup blockweise funktioniert, wird jeder Block nur einmal abgespeichert, Das löst zwar nicht das Problem, der "Unordnung" im Filesystem , aber das Speicherproblem.
ein Tool was Deine Anforderungen umsetzt kenne ich nicht, würde ich aber auch gerne haben.
Eine alternative Lösung wäre es das Filesystem als Deduplicationsspeicher einzurichten. Die Deduplication ist in Windows 2012 integriert und muss nur als Rolle hinzugefügt werden.
Werden die Daten auf dem Filesystem dedupliziert ist es egal, wie oft man das Bild oder die Datei abspeichert, Da die Dedup blockweise funktioniert, wird jeder Block nur einmal abgespeichert, Das löst zwar nicht das Problem, der "Unordnung" im Filesystem , aber das Speicherproblem.
Zitat von @117471:
Unter Linux ließe sich so etwas meines Erachtens nach schnell basteln.
Unter Linux ließe sich so etwas meines Erachtens nach schnell basteln.
Moin,
fdupes wäre da das Mittel der Wahl.
Aber sein neuer Filer wird definitiv ein SBS2012R2
und ein zweiter Server kommt absolut nicht in die Tüte (auch nicht als VM).
und ein zweiter Server kommt absolut nicht in die Tüte (auch nicht als VM).
Einfach fdupes an Windows anpassen. Sollte da genausogut funktionieren.
lks
PS: Man könnte das eigentlch recht einfach selbst per skript bewerkstelligen:
- Einen index mit hashwerten (md5, sha1, sha256, o.a.) der Dateien in den betroffenen Ordnern aufbauen.
- Bei gleichen hashes die dazugehörigen Dateien byteweise vergleichen.
- Sind die dateien gleich, einfach hard verlinken.
Sollte eigentlich relativ schnell "zusammengestoppelt" sein.
Moin FA-jka,
Aufruf erfolgt dann so:
p.s. Die Hashing-Function kann man ab PS 4.0 auch durch das CMDlet Get-FileHash ersetzen, hab's hier nur für ältere PS-Versionen kompatibel gemacht.
Viel Spaß
Grüße Uwe
Zitat von @117471:
"Einfach"
hier mal schnell sowas mit Powershell "zusammengeschrotet" und grob angetestet (Ausprobieren erfolgt auf eigene Gefahr) :"Einfach"
Aufruf erfolgt dann so:
powershell.exe -File "C:\replace_duplicates_with_hardlinks.ps1" "D:\Datenpfad"
replace_duplicates_with_hardlinks.ps1
param(
[parameter(mandatory=$true)][string]$dir
)
# function calculate MD5 hash of file object
function md5([System.IO.FileInfo]$fileobj){
$md5 = [System.Security.Cryptography.MD5]::Create()
Try{
$stream = $fileobj.OpenRead()
$hash = [System.BitConverter]::ToString($md5.ComputeHash($stream))
$stream.Close();$stream.Dispose();$md5.Dispose()
return $hash
}catch{
write-host "Error: $($_.Exception.Message)"
return $false
}
}
# function to create new hardlink
function New-HardLink {
param
(
[Parameter(Mandatory=$true)]$originalfile,
[Parameter(Mandatory=$true)]$mirrorfile
)
$code = '
[DllImport("Kernel32.dll")]
public static extern bool CreateHardLink(string lpFileName,string lpExistingFileName,IntPtr lpSecurityAttributes);
'
Add-Type -MemberDefinition $code -Name Links -Namespace Utils
[Utils.Links]::CreateHardLink($mirrorfile,$originalfile,[IntPtr]::Zero)
}
$files = dir $dir -Recurse | ?{!$_.PSIscontainer}
$hashes = @()
# Create Hashes of files
write-host "Hashing der Dateien gestartet..."
foreach($file in $files){
$md5hash = md5 $file
$hashes += new-object PSObject -Property @{"FileObject"=$file;"Hash"=$md5hash}
}
# select equal hashes with count greater 1
$hashes | group Hash | ?{$_.Count -gt 1} | %{
# select files with same LastWriteTime in Hashgroup
$dupes = $_.Group.FileObject | group LastWriteTime | ?{$_.Count -gt 1} | select Group
$dupes | %{
$original = $_.Group | select -Expand Fullname -First 1
$additional = $_.Group | select -Expand Fullname -Skip 1
$additional | %{
# delete duplicate
remove-item $_ -Force
write-host "Ersetze '$_' durch einen Hardlink auf '$original'" -ForegroundColor Cyan
# create hardlink for duplicate
New-HardLink $original $_ | out-null
}
}
}
Viel Spaß
Grüße Uwe
Zitat von @colinardo:
Moin FA-jka,
> Zitat von @117471:
> "Einfach"
hier mal schnell sowas mit Powershell "zusammengeschrotet" und grob angetestet (Ausprobieren erfolgt auf eigene
Gefahr) :
Moin FA-jka,
> Zitat von @117471:
> "Einfach"
hier mal schnell sowas mit Powershell "zusammengeschrotet" und grob angetestet (Ausprobieren erfolgt auf eigene
Gefahr) :
Hallo Uwe,
ich bewundere, wieviel Energie Du in "fertige" Lösungen steckst, wo ich nur "Übungsaufgaben" hinschreibe. Chapeau.
lks