Portál AbcLinuxu, 4. prosince 2025 08:24
diff --brief -r a b
bash$ diff -r --brief a b Files a/a and b/a differ File a/b is a regular empty file while file b/b is a directory Only in b: c bash$ find b/b b/b b/b/g b/b/hTo že diff jen oznámí že to je adresář ale soubory v něm nevypíše je trochu zákeřné :(
md5sum nebo sha1sum. Hash se porovná mnohem rychleji než kompletní obsah souboru. S pomocí např. sortu se dají najít shodné soubory s různým názvem mezi tisícovkami jiných souborů během velmi krátké doby.
mp2=""
ls -S -- *.mp3 | while read; do
mp3="$REPLY"
if [[ -n "$mp2" ]]; then
size2="$(stat --format "%s" -- "$mp2")"
size3="$(stat --format "%s" -- "$mp3")"
if [[ "$size3" == "$size2" ]]; then
md5sum2="$(md5sum -- "$mp2" | cut -d\ -f 1)"
md5sum3="$(md5sum -- "$mp3" | cut -d\ -f 1)"
if [[ "$md5sum3" == "$md5sum2" ]]; then
echo "ln -s -- \"$mp2\" \"$mp3\""
rm -- "$mp3" && ln -s -- "$mp2" "$mp3"
continue
fi
fi
fi
mp2="$mp3"
done
Samozřejmě hodně záleží na účelu použití, poškozené (tedy jinak velké) soubory se stejným názvem by se hledaly zase jinak, že, ale princip je podobný.
md5sum třeba sha1sum nebo sha512sum.
Bez parametru pouze vyhledává duplicity, s parametrem -rm je i smaže.
#!/bin/sh
#
old=xxxxxxxxxxxxxxxxxxxxxxxxxx
oldn=xxxxxxxxxxxxxxxxxxxxxxxxxx
stav=0
find . -type f -iname "*" -exec md5sum '{}' ';' |
sort |
while read md5 nazev; do
if test "$old" = "$md5"; then
if test $stav -eq 0; then
echo "=== $oldn";
stav=1;
fi
if test "$1" = "-rm"; then
echo "rm $nazev"
rm "$nazev"
else
echo " $nazev"
fi
else
stav=0
fi
old="$md5"
oldn="$nazev"
done
rsync -rvcn a b, tj. nedělat nic ve skutečnosti, jen vypisovat co by udělal.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.