UcallWeconn

Unix скрыпт для выдалення дублікатаў файлаў

Original here

UcallWeconn S.M.B.A., which provides cheap international telephony and sells racks in the datacenter in the Netherlands, made this translation possible

Наступны скрыпт знаходзіць дублікаты (2 ці больш аднолькавых) файлаў і выводзіць новы скрыпт, які змяшчае з-гт пракаментаваў заявы для выдалення іх (скапіюйце тэкст тут):

 
OUTF=rem-duplicates.sh; echo "#! /bin/sh" > $OUTF; find "$@" -type f -exec md5sum {} \; 
| sort --key=1,32 | uniq -w 32 -d --all-repeated=separate | sed -r 's/^[0-9a-f]*
( )*//;s/([^a-zA-Z0-9./_-])/\\\1/g;s/(.+)/#rm \1/' >> $OUTF; chmod a+x $OUTF; ls -l $OUTF

Затым Вы павінны змяніць файл, каб абраць, якія файлы захоўваць - скрыпт не можа бяспечна рабіць гэта аўтаматычна!

Калі вы аддаяце перавагу праграмы C, паспрабуйце, напрыклад fdupes (можа таксама быць даступныя ў сховішча з вас каханы дыстрыбутыў ). Для GUI рашэнне, заснаванае FSlint можа зрабіць гэта за вас.

Код быў напісаны для Debian GNU / Linux і быў правераны з Bash, Zsh і Dash. Зразумела, вы можаце рабіць што заўгодна з ім датуль, пакуль вы не вінаваціце мяне за бедствы ... (выпушчаны ў грамадскім здабытку)

Дзякуючы Лендерт Мэйер, Uriel, Патрык-Эміль Z?rner і некаторыя іншыя для тэставання і паляпшэнні сцэнара.

Той жа сцэнар у больш форме:

 
OUTF=rem-duplicates.sh;
echo "#! /bin/sh" > $OUTF;
find "$@" -type f -exec md5sum {} \; |
    sort --key=1,32 | uniq -w 32 -d --all-repeated=separate |
    sed -r 's/^[0-9a-f]*( )*//;s/([^a-zA-Z0-9./_-])/\\\1/g;s/(.+)/#rm \1/' >> $OUTF;
chmod a+x $OUTF; ls -l $OUTF

... І (трохі састарэлы) варыянт для старэйшага Uniq і сартаванні версіі (напрыклад, у Debian Woody):

 
OUTF=rem-duplicates.sh; ESCSTR="s/([^a-zA-Z0-9])/\\\\\1/g";
SUM="dummy"; echo "#! /bin/sh" > $OUTF; find -type f | sed -r
"$ESCSTR" | while read x; do md5sum "$x"; done | sort -k 1,32 |
uniq -w 32 -d --all-repeated | while read y; do NEW=`echo
"$y-dummy" | sed "s/ .*$//"`; if [ $NEW != $SUM ]; then echo "" >>

$OUTF; fi; SUM="$NEW"; echo "$y" | sed -r
"s/^[0-9a-f]*(\\ )*//;$ESCSTR;s/(.+)/#rm \1/" >> $OUTF; done;
chmod a+x $OUTF; ls -l $OUTF

Прыклад высновы

 
#! /bin/sh
#rm ./gdc2001/113-1303_IMG.JPG
#rm ./reppulilta/gdc2001/113-1303_IMG.JPG
 
#rm ./lissabon/01-01-2001/108-0883_IMG.JPG
#rm ./kuvat\ reppulilta/lissabon/01-01-2001/108-0883_IMG.JPG
 
#rm ./gdc2001/113-1328_IMG.JPG
#rm ./kuvat\ reppulilta/gdc2001/113-1328_IMG.JPG

Тлумачэнне


  1. напісаць загаловак выйсце сцэнар
  2. спіс усіх файлаў рэкурсіўна па бягучай дырэкторыі
  3. экранировать усе патэнцыйна небяспечныя знакі з xargs
  4. разлік сум MD5
  5. знайсці аднолькавыя сумы
  6. здзіраць MD5 сум і пакінуць толькі іх імёны
  7. бегчы дзіўныя знакі з імёнаў файлаў
  8. напісаць закаментаваны выдаленні файлаў
  9. зрабіць выснову сцэнара запісу і LS-л яе

---