Script segítség (kérés) - Elakadtam

Fórumok

Üdv!

További segítséget kérnék...

Segítségetekkel már sokáig eljutottam.
Még azt kellene megoldanom, hogy hogy az adott partíció minden fájlján menjen végig a ciklus, és ha a fájl md5sum összege megegyezik egy bizonyos számmal, akkor törölje az adott fájlt.

Ugyanis azt már sikerült kigyűjtenem, hogy mely fájlok nem kellenek. Ezeknek a fájloknak az md5sum értékét eltároltam egy azonos.txt nevű fájlban, szépen egymás alá felsorolva. (kb. 5000 ilyen fájl van)

Köszönöm annak, aki segít

(eredeti kérdésem ez volt:

Szükségem lenne egy olyan scriptre, ami egy partíción végignézi az összes fájlt, megnézi a bájtra pontos méretét, majd egy szövegfájlba elmenti a fájlok neveit, elérési útjaikkal együtt - méret szerint sorbarendezve.

Akár részmegoldások is segíthetnek...
Köszi a segítséget, visit)

Hozzászólások

du -ab | sort -n
du -ab | sort -n | awk {'print $2'}

mi bajod volt a find-al? inkább azt tanulja meg kezdő minthogy pár betűvel rövidebb trükközést ami csak spéci igényre jó, a find elég univerzális

find /adott/particio -type f -printf "%s %p\n" | sort -n >kértfájl.txt

(szebb formázás lesz és a "-n" sem kell feltétlen ha "%s" helyett "%12s")

mivel olvasni tudok:

...ami egy partíción...

ezért újabb verziójú find kell neked (man find | grep xdev), és egy fontos kapcsolója:

-xdev Don't descend directories on other filesystems.

A többit ollózd ki ügyesen manpage-kből és az előttem hozzászólóktól, google-ból, ne más kaparja ki a gesztenyét neked, kényszerítsd magad a tanulásra!

szerkadd.: nem ártana az inode-okat is kiíratni, és aszerint egy "uniq -u"-t alkalmazni a duplikált fájllistázás elkerüléséhez, barátkozz a "sort -z", "sort -0", a "find -printf0/-print0" kapcsolókkal is, ha korrekt akarsz lenni, és az LC* környezeti változókkal!

http://www.youtube.com/watch?v=QXz7-BNC6jw
http://nocirc.org/

Jogos, ott a pont!

De ne vegyük el a kedvét a különböző LVM-ekkel való barátkozástól, pszeudofájlrendszerektől, a GVFS játéktól kezdve a komolyabbakig, vagy attól, hogy okosabb leszálló keresős megoldások már az archív vagy iso, virtuális diszkképfájlokat is automatikusan hurkolva csatolják, kezelik a bind-olt csatolási pontokat, speciális fájlokat, vagy netán attól, hogy partíción/szubpartíción belül több fájlrendszer is létezhet párhuzamosan, nem feltétlen egymásba ágyazva...

http://www.youtube.com/watch?v=QXz7-BNC6jw
http://nocirc.org/

szokott itt lenni a hozzáértők részéréől egy kis "versengés"

Elég baj az állítólagos versengés léte! Honnét tudod, hogy nem beadandót oldanak-e meg? Nem halat, hanem hálót kell az ifjú padawanoknak adni. Igaz, hogy a jelen szituációban vélelmezhető értelmes és (másnak) viszonylag nehéz feladat esetén az, hogy nem óvodai beadandóhoz szólunk hozzá, azaz nem tisztességtelen plecsniszerzés célból közölte a topiknyitó a feladatot :)

http://www.youtube.com/watch?v=QXz7-BNC6jw
http://nocirc.org/

Mindannyiótoknak köszönöm!
Ezekből már össze tudom ollózni, amire szükségem van.
Köszönettel: visit

szerk.: nem suliba kell, hanem magamnak. Az is lehet, hogy rossz úton indultam el: a végcél, hogy egy igenis PARTÍCIÓN megtaláljam a fájlduplikátumokat. Rengeteg mentést készítettem adataimról, képeimről, stb. Ez az idők folyamán nagyon elterebélyesedett, és követhetetlen, mi hol van meg, és hányszor... Vannak képek, amiket már át neveztem, talán nem is egyszer, és most törölni akarom a az "egynél több előfordulásúakat" ... :-)

md5sum helyett cksum-ot javaslok, mert gyorsabb. cksum egyezés után meg "diff" parancs használatát javaslom.

Hasonló megfontolásból elkövettem anno duplikáltszűrő purgáló szkriptet saját mp3, s3m, it, bmx/bmw nótákra kisujjból előráztam úgy, hogy hibatűrően működött szóközös-újsoros fájlnevekre is, utána még kb. óráig futott a purgálás.

http://www.youtube.com/watch?v=QXz7-BNC6jw
http://nocirc.org/

jaja, megelőztél.

2 alapvető metaalgoritmus lehet.

Egyik: egyetlen egyszer nézzük végig a fájlokat, és mindegyikről lenyomatot veszünk/összehasonlítjuk a korábbiakkal. Ez O(n*n) lépésidejű és lassú a gyakorlatban is, viszont csak egy rekurzív könyvtárbejárás az egész.

Az itt ismertetett jobb megoldási ötletek egy find-dal előszűrnek (find itt sem kell egynél több, csak többszöri fájlnyitogatás), és igen, a cksum olcsóbb hash.

Javasolt lépések:

1. könyvtárkeresés, méretek begyűjtése
2. azonos méretűek csoportosítása ( sort -z| uniq -z -w20)
3. azonos méretűek közül lenyomatok generálása, lehetőleg olcsó hash-sel , hogy gyors legyen
4. az azonos méretű és azonos lenyomatú fájlok közül páronkénti összehasonlítás a listák alapján

aki bátor, és nem atomerőművi adatokkal dolgozik, annak páronkénti összehasonlítás helyett ajánlott tipp egy második, sha* lenyomat elkészítése és a listák uniq-olása

szerk.

http://www.youtube.com/watch?v=QXz7-BNC6jw
http://nocirc.org/

miért egy konkrét partíció érdekes egyébként?

Én pl. egy hasonló cuccot két dologra használok:
-egy filesystemen belül megvan-e ugyanaz többször, ha igen, akkor törlök, vagy hardlink.
-valamiről van-e másik filesystemen másolat, mégpedig mennyi, és merre - amiről nincs, arról készítek, amiről túl sok van, abból meg gyomlálok.

G

Miért egy partíció érdekes? - Mondhatnék egy másik wincsesztert is. A lényeg, hogy két wincseszterem van, és az egyikre szeretném összeválogatni a fájlokat. Az újra. A régin pedig több partíción, össze-vissza könyvtárakban némely fájl többször is meg van. a gyári programok megtalálják ugyan a duplikátumokat, de nem tudom, csak egyesével törölni, hiszen át kell néznem, hogy melyik kell. De mint mondtam, odáig már eljutottam, hogy meg van egy fájlban a törlendő fájlok md5sum összegei. Csak azt nem tudom megírni, hogy azokat egy script törölje.

U.I.
Mint már mondtam, nem iskolai feladat. Egyszerűen én nem tudom megírni. Ezért kértem segítséget.

"odáig már eljutottam, hogy meg van egy fájlban a törlendő fájlok md5sum összegei"

ez a fájl hogyan néz ki? md5 érték + fájlnév soronként? írd le hogy hogyan tartalmazza a fájlokat, és hogy mi alapján kellene törölni belőle, akár az összeset, és összedobjuk a script-et.

köszi!

Tehát ez a fájl egy normál txt fájl, ami egy sorban egy 32 karekter hosszúdágú md5sum összeget tartalmaz, majd jön a következő sor, és így tovább.
Ezzel a sorral hoztam létre:

find ! -type d -print0 | xargs -0 md5sum | sed "s/\s.*//" > md5sum210.txt

azután a másik vinyón is megcsináltan ugyanezt, majd az azonos sorokat meghagytam egy harmadik fájban. Így most van egy olyan fájlom, ami csak a tiszta md5sum összegeket tartalmazza, szépen, soronként.
Azokat a fájlokat kellene törölni, amelyeknek az md5sum összege megtalálható ebben a fájlban.
egy 210Gb-os hdd és egy 290Gb hdd-n futtatva ezeket:

find ! -type d -print0 | xargs -0 md5sum | sed "s/\s.*//" > md5sum210.txt

és

find ! -type d -print0 | xargs -0 md5sum | sed "s/\s.*//" > md5sum290.txt

majd összehasonlítottam őket, és az azonosakat megtartottam:

cat md5sum210.txt | while read L; do cat md5sum290.txt | while read K; do
if [ "$L" = "$K" ]
then echo $K
fi
done
done >azonos.txt

most tehát az azonos.txt fájlban vannak tárolva a törlendő md5sum-os fájlok, a 210Gb-os hdd-ről.

Még egyszer köszönöm!

sok fajta megoldás szóba jöhet. most hamar gyorsan így csinálnám:

tehát az azonos.txt csak md5sum összegeket tartalmaz, soronként. azokat a fájlokat szeretnéd törölni, amelyeknek az md5 összege benne van ebben a txt fájlban.

hogy melyik könyvtártól lefelé rekurzív módon törölnéd, azt nem tudom, legyen most ennek a helye: /media/dir

fontos: teszteljed mielőtt élesben ráengeded és mentésed legyen!


#!/bin/bash

DIR="/media/dir"
SAM="azonos.txt"
TMP=$(mktemp)

# lista az összes fájlról a mappán belül
find "$DIR" ! -type d -print0 | xargs -0 md5sum | sort > "$TMP"
# keressük meg az azonos.txt összegein egyesével lépkedve a megegyezőket
cat "$SAM" | sort | while read FF; do
   # ha több is egyezik, akkor mindegyiken végig lépkedünk megint
   grep "$FF" "$TMP" | while read F2; do
      # az egyezőknél csak a fájlnév kell
      DEL=$(echo "$F2" | grep -iEo "/.*$")
      echo "$DEL"
      # törlés
      #rm -f "$DEL"
   done
done

Mindenek előtt mindenkinek köszi, hogy segítetek.

log69: sajnos nem igazán értek mindent, amit írtál, de most googlizok, meg "man"-ozok, hogy megértsem.
A kiinduló könyvtár maga a gyökér: "/", mert a teljes partíciót végignézem. Ekkor tehát a sripted első sora így fest, igaz?: DIR="/" És magát a scripted a gyökérbe másolom, és onnan indítom.

pme: a comm-ról azt találtam, hogy "sorrol-sorra" összehasonlítja a két fájlt.Ha mondjuk az egyik fájl első sora megegyezik a második fájl hatodik sorával, akkor is kiadja eredménynek a megegyezést?

fdupes -fnr . >duplicates

A duplicates fájlba kerülnek azok a fájlnevek, melyek másodszor fordulnak elő. A keresés md5sum alapján történik. Ha az a cél, hogy töröljük a cuccaink közül a felesleges másodpéldányokat, akkor

cat duplicates | xargs rm

Persze előtte illik átnézni a duplicates fájlt:)