tobiasbeil
Bitchass User
File-Duplikate in einem Verzeichnis löschen und verlinken.
Hallo.
An dieser Stelle wollte ich nur mal kurz
auf meinen Thread bzgl. File-Duplikate
aufmerksam machen.
der Thread ist zu finden hier:
http://www.linuxforen.de/forums/showthread.php?t=186531
Ich dachte mir der eine oder andere AIX User,
der mit NIM etwas zu tun hat könnte dies sehr gut
gebrauchen, um Speicherplatz zu sparen.
Es geht darum FileDuplikate zu identifizieren, löschen,
und dann per symbolische Links wiederherzustellen.
Somit wird die Funktionalität der Filestruktur gewährt,
aber teilweise beachtlich viel Speicherplatz gespart.
Momentan basiert die Duplikat-Ermittlung nach Dateinamen,
ich bin offen für erweiterngen, welche Dateigrösse überprüfen
oder Hashing verwenden, aber das steht alles auch im Thread.
Bye.
EDIT:
An dieser Stelle steht nun immer die neueste Version des Scriptes,
weil ich es leid bin jedesmal nen post zu schreiben, ist ja auch schlecht
zum Thread-lesen/blättern. In diesem Sinne und der Übersicht halber:
Hallo.
An dieser Stelle wollte ich nur mal kurz
auf meinen Thread bzgl. File-Duplikate
aufmerksam machen.
der Thread ist zu finden hier:
http://www.linuxforen.de/forums/showthread.php?t=186531
Ich dachte mir der eine oder andere AIX User,
der mit NIM etwas zu tun hat könnte dies sehr gut
gebrauchen, um Speicherplatz zu sparen.
Es geht darum FileDuplikate zu identifizieren, löschen,
und dann per symbolische Links wiederherzustellen.
Somit wird die Funktionalität der Filestruktur gewährt,
aber teilweise beachtlich viel Speicherplatz gespart.
Momentan basiert die Duplikat-Ermittlung nach Dateinamen,
ich bin offen für erweiterngen, welche Dateigrösse überprüfen
oder Hashing verwenden, aber das steht alles auch im Thread.
Bye.
EDIT:
An dieser Stelle steht nun immer die neueste Version des Scriptes,
weil ich es leid bin jedesmal nen post zu schreiben, ist ja auch schlecht
zum Thread-lesen/blättern. In diesem Sinne und der Übersicht halber:
Code:
#!/bin/sh
# Description:
#
# This script will search within the directory it is
# executed in (# sh rmdupl.sh) for files with same
# filename AND same size in bytes AND same MD5 checksum.
# After all those "duplicate" files where found the script
# deletes the duplicate instances and replaces them by
# hardlinks of the appropriate "source" files resulting
# in less physical space requirement while the logical
# functionality of each directory hierarchy is preserved.
# Checking if script is run in root directory. If true,
# script will exit, because it cant handle device files.
# Do not run script in root dir nor uncomment below lines.
pwd=$(pwd)
if [ "${pwd}" = "/" ]
then
echo 'This script is not applicable on the root directory. Exiting...'
exit 1
fi
# Setting up working/temporary directory
wd=/tmp/rmdupl
randir=$(echo $RANDOM$RANDOM$RANDOM$RANDOM$RANDOM | head -c 16)
# Setting absolute path to GNU 'find' for AIX systems
# whos 'find' does not know the '-printf' option.
# Linux Toolbox for AIX or GNU 'find' needed.
opt=/opt/freeware/bin/
# If Linux is used instead AIX, GNU 'find' is already present,
# so comment in below line and comment out the above.
#opt=
echo 'Creating temporary working directories...'
mkdir -p ${wd}.${randir}/duplicates
echo 'Searching for files with same filename AND size in bytes AND MD5 sum...'
${opt}find . -type f -printf '%f\n' | grep -v '.toc' | sort | uniq -d > ${wd}.${randir}/uniq.filenames
${opt}find . -type f -printf '%s\n' | grep -v '.toc' | sort | uniq -d > ${wd}.${randir}/uniq.sizes
${opt}find . -type f -printf '%f.%s\n' | grep -v '.toc' | sort | uniq -d > ${wd}.${randir}/uniq.filenamesandsizes
for filenamesandsizes in $(cat ${wd}.${randir}/uniq.filenamesandsizes)
do mkdir ${wd}.${randir}/duplicates/${filenamesandsizes}
done
#endfor
echo 'Calculating MD5 sums of duplicate files. This can take a while...'
for filenames in $(cat ${wd}.${randir}/uniq.filenames)
do for sizes in $(cat ${wd}.${randir}/uniq.sizes)
do if [ -d ${wd}.${randir}/duplicates/${filenames}.${sizes} ]
then
${opt}find . -type f -name ${filenames} -size ${sizes}c -printf '%p\n' > ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.paths
for paths in $(cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.paths)
do md5sum=$(md5sum ${paths} | head -c 32)
echo ${paths} >> ${wd}.${randir}/duplicates/${filenames}.${sizes}/md5.${filenames}.${sizes}.${md5sum}
md5sum=
done
#endfor
cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/md5.${filenames}.${sizes}.* | uniq -d > ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.md5list
if [ ! -s ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.md5list ]
then
head -n 1 ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.paths > ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.src
cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.src ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.paths | uniq -u > ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.links
srctmp=$(cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.src)
for links in $(cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/duplicates.links)
do rm -f ${links}
ln -s ${srctmp} ${links}
done
#endfor
srctmp=
else
${opt}find ${wd}.${randir}/duplicates/${filenames}.${sizes}/ -type f -name md5.${filenames}.${sizes}.* -printf '%f\n' > ${wd}.${randir}/md5.tmp
for md5files in $(cat ${wd}.${randir}/md5.tmp)
do head -n 1 ${md5files} > ${wd}.${randir}/duplicates/${filenames}.${sizes}/${md5files}.src
cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/${md5files}.src ${md5files} | uniq -u > ${wd}.${randir}/duplicates/${filenames}.${sizes}/${md5files}.links
srctmp=$(${wd}.${randir}/duplicates/${filenames}.${sizes}/${md5files}.src)
for links in $(cat ${wd}.${randir}/duplicates/${filenames}.${sizes}/${md5files}.links)
do rm -f ${links}
ln ${srctmp} ${links}
done
#endfor
srctmp=
done
#endfor
fi
fi
done
done
#endfor
# Cleaning up...
echo 'Cleaning up after finish...'
rm -fr ${wd}.${randir}
echo 'Done.'
exit 0
Zuletzt bearbeitet: