Portál AbcLinuxu, 9. května 2025 05:56
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ř. sort
u 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" doneSamozř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.