「https://github.com/taltman/scripts/blob/master/unix_utils/find-dupes.awk」をLinux/Ubuntuに移植

「https://github.com/taltman/scripts/blob/master/unix_utils/find-dupes.awk」をLinux/Ubuntuに移植

質問: 重複ファイルを探す速度が速く、ファイルを開いてハッシュする必要はありません。 @taltmanは素晴らしいと速いスクリプトを書いた。ここ、MD5は、同じサイズのファイルが見つかった場合にのみ使用されます。このスクリプトはCentosでのみ実行されます。そして、最大のファイルの出力を提供しません。

状態:Cinnamon Mintで実行するスクリプトを移植しました。ファイル名のスペースも処理できます。それここ。次のように出力します。

MD5 30599d19eb93cfb45030a1b0270e698c:
        ./../abc.jpg
        ./../xyz.jpg
MD5 3d0bc4e9ec8c77f5a430d8455252ef58:
        ./../def.mp4
        ./../hij.mp4

レポートブロックにサイズ(下が最も大きい)でソートを追加してサイズを表示したいです。出力は私が好きなものと同じです。

## 4.53MB (MD5 30599d19eb93cfb45030a1b0270e698c):
        ./../abc.jpg
        ./../xyz.jpg
## 1.76GB (MD5 3d0bc4e9ec8c77f5a430d8455252ef58):
        ./../def.mp4
        ./../hij.mp4

助けを求める:AWKを本当に理解する人はいますか?助けたいですか?

ベストアンサー1

あなたの質問に対する答えではないかもしれませんが、実装するのは簡単です。私はそれをbashで書いたが、おそらくawkを扱うよりも簡単です。

#!/usr/bin/env bash

die()
{
  echo >&2 "$@"
  exit 1
}

usage()
{
  echo >&2 "Usage: $0 path"
  die
}

checkdupes() {
  local path="$1"
  declare -A flist
  declare -a output_array

  while read -r sum fname; do
    if [[ ${flist[$sum]} ]]; then
      fsize=$(stat --printf="%s" "$fname")
      fsize_converted=$(convert_bytes "$fsize")
      output_array+=("$fsize_converted $(md5sum "$fname") and ${flist[$sum]} are identical")
    fi
    flist[$sum]+="$fname"
  done < <(find "$path" -type f -exec sha256sum {} +)

  IFS=$'\n' sorted_array=($(sort -h <<<"${output_array[*]}"))
  unset IFS
  for ((i=${#sorted_array[@]}-1; i>=0; i--)); do
    printf '%s\n' "${sorted_array[i]}"
  done
}

convert_bytes() {
  local bytes=$1
  local unit=""
  local value=""

  if ((bytes < 1024)); then
    unit="B"
    value=$bytes
  elif ((bytes < 1048576)); then
    unit="KB"
    value=$((bytes / 1024))
  elif ((bytes < 1073741824)); then
    unit="MB"
    value=$((bytes / 1048576))
  else
    unit="GB"
    value=$((bytes / 1073741824))
  fi

  printf '%d%s' "${value}" "${unit}"
}

if (($# < 1)); then
  usage
else
  checkdupes "$1"
fi

私のSEスクリプトでこの部分を見ることができます。

die()
{
  echo >&2 "$@"
  exit 1
}

usage()
{
  echo >&2 "Usage: $0 path"
  die
}

これは実際にエラー処理の一部です。というファイルを生成してerrorhandling スクリプトからインポートできます。

使用法:

./check_dupes [path]

役に立ったことを願っています!

おすすめ記事