Portál AbcLinuxu, 10. května 2025 09:53
07a5b83a20f5d4002fff208e8180eba1
07a5b83a20f5d4002fff208e8180eba1
07a5b83a20f5d4002fff208e8180eba1
07a5b83a20f5d4002fff208e8180eba1
7555bf7259c046c651fa4253059ca4a7
8b8a8b353298f798e3eb8628661617b6
8b8a8b353298f798e3eb8628661617b6
8b8a8b353298f798e3eb8628661617b6
8ead78f99561b4c8e2757e588ff8891a
uniq vypise:
07a5b83a20f5d4002fff208e8180eba1
7555bf7259c046c651fa4253059ca4a7
8b8a8b353298f798e3eb8628661617b6
8ead78f99561b4c8e2757e588ff8891a
A ja potrebuju vypsat vse krome toho co vypsal
07a5b83a20f5d4002fff208e8180eba1
07a5b83a20f5d4002fff208e8180eba1
07a5b83a20f5d4002fff208e8180eba1
8b8a8b353298f798e3eb8628661617b6
8b8a8b353298f798e3eb8628661617b6
8b8a8b353298f798e3eb8628661617b6
tzn pokud se tam opakuje neco 4x, tak aby to vypsal jen 3x. Za tema md5sum jsou pak cesty k souborum, ktere budu pak potrebovat smazat, aby nebyly na disku 2x, ale jen pouze 1x
Jak vyresit tento problem?
Řešení dotazu:
perl -ne '$_{$_}++&&/(\S+)\s+(.*)/&&print("rm $2\n")&&`rm $2`' soubor_se_seznamem_md5sum
`rm $2`unlink $2
perl -ne '$_{$_}++&&/\S+\s+(.*)/&&print("rm $1\n")&&unlink($1)' SUBOR
...takto je to uz lepsie perl -ne '/(\S+)\s+(.*)/&&$h{$1}++&&print("rm $2\n")&&unlink($2)' SUBOR
Suma sumarum -> prvy vyskey MD5 hodnoty je ignorovany... ostatne vyskyty su odchytene a subory vymazane... #!/bin/bash sum0='x' name0='x' nt=0 nr=0 while read sum name; do : $[nt++] if [ $sum = $sum0 ]; then echo "'$name' = '$name0'" rm "$name" : $[nr++] else sum0="$sum" name0="$name" fi done echo "total: $nt" echo "removed: $nr"
sha1sum
je samozřejmě potřeba nejdřív prohnat sort
em.
md5sum * | sort | uniq -w 32 -d
md5sum * | sort | sed -rn 'x;G; s/([^ ]*) (.*)\n\1 //p'(Vstup sedu je zotriedeny zoznam sum. Sed si odlozi aktualny riadok do hold-space a pozrie, ci sa retazec zlepeny z predosleho a aktualneho riadku (oddeleny \n) obsahuje "suma1 cesta1\nsuma1 ". Ak ano, tak akt. riadok ma rovnaku sumu ako predosly, vypise iba cestu aktualneho riadku a ide na dalsi riadok. Ak neobsahuje, tak rovno ide na dalsi riadok.) Nastroj, ktory robi presne opak uniqu (bez logiky so sumami a cestami) sa da spravit 2 sposobmi, ktore sa lisia len cesto, ako zo zlepeneho retazca zase vyrobit jeho druhy komponent:
sed -rn 'x; G; s/^(.*)\n\1$/\1/p' sed -rn 'x; G; /^(.*)\n\1$/{g;p}'
07a5b83a20f5d4002fff208e8180eba1 cesta1 07a5b83a20f5d4002fff208e8180eba1 cesta2 07a5b83a20f5d4002fff208e8180eba1 cesta3 07a5b83a20f5d4002fff208e8180eba1 cesta4Rspektive ktera cesta je ta "prava" 1, 2,3 nebo 4? Neni pozadavek nesmysl? NN
grep -v `uniq zoznam.txt` zoznam.txt
?
sort | uniq -c | sed 's/ */ /g' | grep -v "^ 1 "
(seřadíš, spočítáš výskyty jednotlivých řádek, odstraníš zbytečné mezery, a vynecháš řádky, co mají výskyt 1)
sort | uniq -c -w32 | grep -v "^ *1 "ale neriesi to problem, ze sice budes vediet, ktore sumy mas mazat, ale stratis cesty k suborom (pretoze uniq necha iba jeden z nich).
sort | uniq -c -w 32 | grep -v '^ *1' | awk '{print $3}'
spis je problem, ze to smaze pouze 1 soubor ze 4 vyskytu toho stejneho, takze ti tam dal zustane 3x.
#!/usr/bin/python import sys,os seen=set() for l in sys.stdin: md5,name=l[:-1].split() if md5 in seen: os.remove(name) seen.add(md5)a seznam souborů poslat rourou
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.