2024. április 20., szombat

Gyorskeresés

Napi okosság: Duplikációk felderítése merevlemezünkön.

Írta: |

[ ÚJ BEJEGYZÉS ]

Nem egy high-end script, annyit tud, hogy ahol lefuttatjuk a scriptet (mappában, vagy a merevlemez gyökerében) ott összeszedi a duplikált fájlokat, majd ezeket név szerint kigyűjti egy txt fájlba. Hogy mire jó? Talán arra, hogy fényt deríthessünk rá, hogy mennyi duplikált objektumunk van (ahol objektum lehet bármi, szöveges állomány, kép, zene, film stb..)

Az, hogy két fájl ugyanaz-e, névegyezőség, és méretegyezőség szerint dől el, nem az igazi, de már így is sokáig fut a script, így ennél erősebb vizsgálatot nem akartam betenni.

Nálam a 230 gigás ADAT merevlemez gyökeréből indítva, ~17000 fájlt megvizsgálva 45 percig futott a script, de fény derült arra is, hogy ha venném a fáradtságot akkor több mint 2000 fájlt (zenét, képet etc) törölhetnék ki, mert ezeknek létezik másik példánya is.

Az eredmény egy multiples.txt állományban található abban a mappában, ahol futtattuk a scriptet.

-----------------------------------------------------------------------------------------------------------

UPDATE: a cikk alján van egy gyorsabb megoldás!

A script letölthető innen. Nyissunk meg egy PowerShell ablakot (C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe) rendszergazdaként (jobb klikk, run as administrator), majd navigáljunk el abba a mappába, ahol a lekérdezést futtatni akarjuk, majd hívjuk meg a scriptet.

Példa:
Ha a myscript.ps1 scriptet az D:\Downloads mappába mentettük, akkor a következő paranccsal tudjuk futtatni:
PS D:\> .\Downloads\myscript.ps1
Ekkor a D meghajtó egész tartalmát monitorozni fogja és nem a D:\Downloads mappáét!

-----------------------------------------------------------------------------------------------------------

$loc = get-location
$files = get-childitem -Path $loc -Recurse | where {$_.Length -gt 0}
$length = $files.length
$multiples = @()
$rows = 0
$groups = 0
write-host "Working with $length files, please wait.."
[int]$10n = $length*0.1
[int]$20n = $length*0.2
[int]$30n = $length*0.3
[int]$40n = $length*0.4
[int]$50n = $length*0.5
[int]$60n = $length*0.6
[int]$70n = $length*0.7
[int]$80n = $length*0.8
[int]$90n = $length*0.9
[int]$100n = $length
for($i=0;$i -lt $length;++$i){
$ismultiple = 0
$tempi = $files[$i]
switch($i)
{
$10n { write-host "10%" }
$20n { write-host "20%" }
$30n { write-host "30%" }
$40n { write-host "40%" }
$50n { write-host "50%" }
$60n { write-host "60%" }
$70n { write-host "70%" }
$80n { write-host "80%" }
$90n { write-host "90%" }
$100n { write-host "100%" }
}
if($multiples -contains $tempi.FullName){ } else {
for($j=$i+1;$j -lt $length;++$j){
$tempj = $files[$j]
if($tempj.Name -eq $tempi.Name -and $tempj.Length -eq $tempi.Length){
$multiples += $tempj.FullName
$rows++
$ismultiple = 1
}
}
if($ismultiple){
$multiples += $tempi.FullName
$rows++
$groups++
$multiples += "`n"
}
}
}
write-host "$loc folder has $length files, there are $groups files multiplied,`n and you could delete $($rows-$groups) files from the $rows multiplications!"
$multiples += "$loc folder has $length files, there are $groups files multiplied,`n and you could delete $($rows-$groups) files from the $rows multiplications!"
$multiples > multiples.txt

-----------------------------------------------------------------------------------------------------------

UPDATE Ez a lenti kód már 45 perc helyett 15 másodperc alatt csinálja meg ugyanazt.

$loc = get-location
$files = get-childitem -Path $loc -Recurse | where {$_.Length -gt 0}
$length = $files.length
$fileMap = @{}
$duplicates = @()
for($i=0;$i -lt $length;++$i){
$file = $files[$i]
$key = $file.Name +" "+ $file.Length +"byte"

if($fileMap.ContainsKey($key)){
$fileMap[$key] += $file.FullName
} else {
$fileMap[$key] = @($file.FullName)
}

}
foreach ($item in $fileMap.GetEnumerator()) {
if($item.Value.Length -gt 1){
$duplicates += $item.Name+":"
$duplicates += $item.Value
$duplicates += "`n"
}
}
$duplicates > fileMap.txt

Címkék: powershell, duplikátumok, duplikált fájlok, egyezőségek, fájlba írás

Hozzászólások

(#1) Jim-Y


Jim-Y
veterán

Open

(#2) lapa


lapa
veterán

17.000 fájlon fut 45 percig és csak méretet meg nevet vizsgál? nem lett volna egyszerűbb egy dir rekurzívan, aztán excelben sorrendezni összesen 3 perc alatt?

valami nem stimmel ott. amúgy erősebb vizsgálat csak azoknál kéne, amik egyeztek, szóval ez szerintem nem befolyásolná nagyon.

[ Szerkesztve ]

(#3) Dluinet válasza Jim-Y (#1) üzenetére


Dluinet
nagyúr

van erre egy csomó ingyenes program:
Duplicate Cleaner
AllDup
DiskBoss

vagy hordozható verzióba:
DoubleKiller, Easy Duplicate Finder, Duplicate File Finder, DirComp

"Mindig is első szerettem volna lenni!" - II. János Pál pápa

(#4) Jim-Y válasza lapa (#2) üzenetére


Jim-Y
veterán

nem a név és méretvizsgálat miatt fut ennyi ideig, hanem mert ciklus van a ciklusban, ez 17.000 adatnál ilyen lassú sajnos :/

Az Excelt én elvből nem nyitom meg ;] Amúgy igen, biztos egyszerűbb úgy, de tudod azért szerkesztettem ilyenre a bejegyzést, illetve raktam a végére Címke felhőt, hogy kereshető legyen, mert valakinek még szüksége lehetne valamire a kódból:)

A Programozós fórumban jelenleg is folyik az eszmecsere, hogy mivel lehetne gyorsítani a dolgokon.

(#5) Jim-Y válasza Dluinet (#3) üzenetére


Jim-Y
veterán

Köszi, ezeket majd mindenképp beteszem a Hasznos Linkek közé, de jelenleg nem az volt a célom, hogy megszüntessem a duplikációkat, hanem inkább, hogy a hozzám hasonló programozó palántákhoz eljuthasson a szösszenet, ezer, meg ezer ehhez hasonló szösszenet van a neten, nagyon helyesen, ha valami komplex dolgot akar megvalósítani az ember, akkor az ilyen kis kódrészletek nagyon jól tudnak jönni, tapasztalatból mondom:)

(#6) F34R


F34R
nagyúr

Jo ez ;] nekem zeneim kozt van duplikatum egy par, de nem vallalom a megkereseset mert par ezer van. A nevuk nem ugyan az (marmint a struktura ahogy el van nevezve) igy kicsit masabb. Meg van ami webshopbol van azoknak meg nincs is rendes id3 tag-se azokat csak sajnos hallas alapjan tudom beazonositani.

(#7) lapa válasza Jim-Y (#4) üzenetére


lapa
veterán

én a powershellt elvből nem nyitom meg, de szerintem csak lehetne valami tömböt létrehozni, és csak a végén sorrendezni, hogy kijöjjön a való. azért ahogy nézegettem régebben a ps elég erőteljes (mármint winhez képest mérve). azt értem, hogy a kód a lényeg, csak eszerint a példa nem túl szerencsés.

az excel a második (harmadik) legfontosabb dolog, amit megtanulhatsz angol meg német nyelv után.

[ Szerkesztve ]

(#8) Jim-Y válasza F34R (#6) üzenetére


Jim-Y
veterán

Alapból van olyan PowerShell lehetőség, hogy diff $a $b ami megnyitja a fájlt, végigmegy benne soronként, és ha ugyanaz akkor hamissal, ha van benne különbség akkor igazzal tér vissza, nyílván ezt a sort:
if($tempj.Name -eq $tempi.Name -and $tempj.Length -eq $tempi.Length){

simán le lehetne cserélni egy diff-esre, de akkor már tényleg nagyon sok ideig tartana az összehasonlítás egy egész partícióra :(
Na mindegy, legalább elfoglaltam magam ^^

(#9) Jim-Y válasza lapa (#7) üzenetére


Jim-Y
veterán

A rendezéssel az a baj, hogy ha lekéred a fájlokat akkor egy fájl valahogy így fog kinézni:

D:\User\Zenék\ABBA\zeneszam.mp3
ez egy tök más helyen is lehet, például
D:\Dokumentumok\Mintazenék\Régiek\zeneszam.mp3

Most a fentieket hogy rendezed lexiografikusan úgy, hogy egymás mellé kerüljenek? :/
Aprobléma azzal van, hogy az algoritmus 1500 fájl esetén 1500x1500-szor fog végigmenni egy tömbön, ami lassú, erre kéne megoldást találni.

Hát nem tudom, tisztában vagyok vele, hogy sokaknak tesz jó szolgálatot az Excel, és méltán híres, de én mint programozó nem nagyon csípem. De ez csak azért lehet, mert még tanulom a szakmát, erősen, mint a fentiekből is látszik. Ha a fő érv az lenne, hogy a problémát gyorsan oldjam meg, és az excel lenne a legalkalmasabb erre, akkor nyílván azt használnám, és nem érdekelne, hogy mennyire puritán dolog azt használni :D

Puritán alatt azt értettem, hogy míg egyik munkatársam a nagy adathalmazt excellel szerette volna beolvasni/rendezni/feldolgozni, addig én egyből írtam volna rá egy PHP kódot, ami egyből az adatbázisra csatlakozik, így az dinamikusan dolgozta volna fel az adatokat, egyszer kell megírni, és utána teszi a dolgát, míg a munkatárs vélhetően előbb végzett volna az adathalmazzal excelt használva, de semmi olyat nem csinált volna ami utána automatizálta volna a folyamatot.

[ Szerkesztve ]

(#10) F34R válasza Jim-Y (#9) üzenetére


F34R
nagyúr

Nalam egy helyen vannak a zenek azzal nincs baj, a mappan belul vannak duplicatumok.
Egy bash scriptel talan meglehetne oldani....

További hozzászólások megtekintése...
Copyright © 2000-2024 PROHARDVER Informatikai Kft.