Я ищу bash-скрипт, совместимый с Mac, для поиска дубликатов файлов в каталоге.
4 ответа
Не знаю о совместимости с Mac, но это работает для меня (TM):
#!/bin/bash
[ -n "$1" ] || exit 1
exec 9< <( find "$1" -type f -print0 )
while IFS= read -r -d '' -u 9
do
file_path="$(readlink -fn -- "$REPLY"; echo x)"
file_path="${file_path%x}"
exec 8< <( find "$1" -type f -not -path "$file_path" -print0 )
while IFS= read -r -d '' -u 8 OTHER
do
cmp --quiet -- "$REPLY" "$OTHER"
case $? in
0)
echo -n "cmp -- "
printf %q "${REPLY}"
echo -n ' '
printf %q "${OTHER}"
echo ""
break
;;
2)
echo "\`cmp\` failed!"
exit 2
;;
*)
:
;;
esac
done
done
Результатом является набор команд, которые вы можете запустить, чтобы проверить, что результат правильный :)
Редактировать: последняя версия работает с очень странными именами файлов, такими как:
$'/tmp/--$`\\! *@ \a\b\E\E\f\r\t\v\\"\' \n'
Это найдет файлы в директории с dupes. Это довольно сырой, но это работает.
#!/bin/bash
CKSUMPROG=md5sum
TMPFILE=${TMPDIR:-/tmp}/duplicate.$$
trap "rm -f $TMPFILE" EXIT INT
if [ ! -d "$1" ]
then
echo "usage $0 directory" >2
exit 1
fi
PRINTBLANK=
# dump fingerprints from all target files into a tmpfile
find "$1" -type f 2> /dev/null | xargs $CKSUMPROG > $TMPFILE 2> /dev/null
# get fingerprints from tmpfile, get the ones with duplicates which means multiple files with same contents
for DUPEMD5 in $(cut -d ' ' -f 1 $TMPFILE | sort | uniq -c | sort -rn | grep -v '^ *1 ' | sed 's/^ *[1-9][0-9]* //')
do
if [ -z "$PRINTBLANK" ]
then
PRINTBLANK=1
else
echo
echo
fi
grep "^${DUPEMD5} " $TMPFILE | gawk '{print $2}'
done
Если интересуют только файлы в текущем каталоге (как указано OP), то это самое простое. Для Linux и Windows (MSY - проверено, или MinGW или Cygwin с любым с GnuWin32). Это перечислит все дубликаты.
md5sum * | sort | uniq -D -w 32
Для BSD/Mac OS X (будет перечислен только первый дубликат)
md5 -r * | sort | uniq -d -w 32
у меня это работает на моем mac, вы поймаете дубликат файла по значению md5:
find ./ -type f -exec md5 {} \; | awk -F '=' '{print $2 "\t" $1}' | sort