Какой самый эффективный способ найти дубликаты файлов?

GracefulRestart отлично решает этот вопрос; как вы отметили в своих комментариях к его ответу, команда lastнедостаточно детализирована. Но, предполагая, что auth.logв Debian достаточно похож на то, что я вижу в Ubuntu, вы могли бы немного посчитать, основываясь на имеющихся там данных.

Я понимаю, что этот не является ответом, но он все равно может быть вам полезен.

Я отфильтровал несколько строк из /var/log/auth.log, они относятся как к локальному, так и к ssh-логину.

cat auth.log
2018-12-06T07:28:00.487714+13:00 server systemd-logind[944]: New session 2597 of user tink.
2018-12-06T08:34:16.360766+13:00 server login[29537]: pam_unix(login:session): session opened for user tink by LOGIN(uid=0)
2018-12-06T08:34:16.372714+13:00 server systemd-logind[944]: New session c4 of user tink.
2018-12-06T08:34:20.960596+13:00 server login[29537]: pam_unix(login:session): session closed for user tink
2018-12-06T08:36:01.197712+13:00 server systemd-logind[944]: Removed session 2597.

Вот (запутанный )awk -скрипт..

cat session.awk
{
  if( $0 ~ /systemd-logind.+New session/  && $0~user ){
      start[$6]=$1
    }
  if( $0 ~ /systemd-logind.+ Removed session/ && start[gensub(/([0-9]+).*/, "\\1", "1", $6)] != ""  ){
      tmp = start[gensub(/([0-9]+).*/, "\\1", "1", $6)]
      cmd = "date +%s -d ";
      cmd  $1 | getline outa;
      cmd " "  tmp | getline ina;
      close( cmd )
      printf "%s was logged in for %s seconds\n", user, outa-ina
    }
  if( $0 ~ /login.+ session opened/  && $0~user ){
      start[gensub(/[^0-9]+([0-9]+).*/,"\\1","1",$3)]=$1
    }
  if( $0 ~ /login.* session closed/  ){
      tmp = start[gensub(/[^0-9]+([0-9]+).*/,"\\1","1",$3)]
      cmd = "date +%s -d ";
      cmd  $1 | getline outa;
      cmd " "  tmp | getline ina;
      close( cmd )
      printf "%s was logged in for %s seconds\n", user, outa-ina
    }
}

Запуск этого фрагмента кода выше:

awk -v user=tink -f session.awk sessions
tink was logged in for 4 seconds
tink was logged in for 4081 seconds
1
28.02.2020, 20:59
3 ответа

FSlintи его серверная часть findup, вероятно, делают именно то, что вам нужно:

FSlint scans the files and filters out files of different sizes. Any remaining files of the exact same size are then checked to ensure they are not hard linked. A hard linked file could have been created on a previous search should the user have chosen to 'Merge' the findings. Once FSlint is sure the file is not hard linked, it checks various signatures of the file using md5sum. To guard against md5sum collisions, FSlint will re-check signatures of any remaining files using sha1sum checks.

https://booki.flossmanuals.net/fslint/ch004_duplicates.html

1
28.04.2021, 23:21

Да, я думаю, он создаст полноценный md5, если размер соответствует другому файлу. Это может быть расточительно. Более эффективным способом для больших файлов может быть md5 в первом блоке и просмотр дальше, только если они совпадают.

Т.е. проверить размер, если совпадает, то проверить md5 первого блока (512k ), если совпадает, то проверить md5 для следующих 2 блоков (1024k )... и т. д.

0
28.04.2021, 23:21

rmlint — очень эффективный инструмент для дедупликации файловых систем и многого другого, кэширования информации, если это необходимо, с помощью xattrs, чтобы сделать последующие запуски еще быстрее, и предоставления метаданных в формате json, чтобы вы могли использовать информацию, которую он выкапывает, по-своему:

rmlint finds space waste and other broken things on your filesystem and offers to remove it. It is able to find:

Duplicate files & directories.
Nonstripped Binaries
Broken symlinks.
Empty files.
Recursive empty directories.
Files with broken user or group id.

Из Руководство пользователя — rmlint

0
28.04.2021, 23:21

Теги

Похожие вопросы