亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

查找目錄中的重復文件

查找目錄中的重復文件

Go
阿波羅的戰車 2023-04-17 16:31:26
這是我的第一個 Go 程序。我正在學習這門語言,但理解所有概念有點困難,所以為了練習我寫了一個代碼來檢測相同的文件。這是一個簡單的程序,可以遞歸地檢查目錄中的重復文件。但:如何檢測目錄文件中的重復文件問題不是遞歸目錄。問題是如何比較
查看完整描述

2 回答

?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

您可以獲取每個文件主體的哈希值,然后比較字典/映射中的哈希值。


package main


import (

    "crypto/md5"

    "fmt"

    "io"

    "io/ioutil"

    "log"

    "os"

)


func main() {

    contentHashes := make(map[string]string)

    if err := readDir("./", contentHashes); err != nil {

        log.Fatal(err)

    }

}


func readDir(dirName string, contentHashes map[string]string) (err error) {

    filesInfos, err := ioutil.ReadDir(dirName)

    if err != nil {

        return

    }

    for _, fi := range filesInfos {

        if fi.IsDir() {

            err := readDir(dirName+fi.Name()+"/", contentHashes)

            if err != nil {

                return err

            }

        } else {

            // The important bits for this question

            location := dirName + fi.Name()

            // open the file

            f, err := os.Open(location)

            if err != nil {

                return err

            }

            h := md5.New()

            // copy the file body into the hash function

            if _, err := io.Copy(h, f); err != nil {

                return err

            }

            // Check if a file body with the same hash already exists

            key := fmt.Sprintf("%x", h.Sum(nil))

            if val, exists := contentHashes[key]; exists {

                fmt.Println("Duplicate found", val, location)

            } else {

                contentHashes[key] = location

            }

        }

    }

    return

}


查看完整回答
反對 回復 2023-04-17
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

使用 sha256 比較文件


例子:


package main


import (

    "crypto/sha256"

    "encoding/hex"

    "fmt"

    "os"

    "path/filepath"

    "sync"

    "flag"

    "runtime"

    "io"

)


var dir string

var workers int


type Result struct {

    file   string

    sha256 [32]byte

}


func worker(input chan string, results chan<- *Result, wg *sync.WaitGroup) {

    for file := range input {

        var h = sha256.New()

        var sum [32]byte

        f, err := os.Open(file)

        if err != nil {

            fmt.Fprintln(os.Stderr, err)

            continue

        }

        if _, err = io.Copy(h, f); err != nil {

            fmt.Fprintln(os.Stderr, err)

            f.Close()

            continue

        }

        f.Close()

        copy(sum[:], h.Sum(nil))

        results <- &Result{

            file:   file,

            sha256: sum,

        }

    }

    wg.Done()

}


func search(input chan string) {

    filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {

        if err != nil {

            fmt.Fprintln(os.Stderr, err)

        } else if info.Mode().IsRegular() {

            input <- path

        }

        return nil

    })

    close(input)

}


func main() {


    flag.StringVar(&dir, "dir", ".", "directory to search")

    flag.IntVar(&workers, "workers", runtime.NumCPU(), "number of workers")

    flag.Parse()


    fmt.Printf("Searching in %s using %d workers...\n", dir, workers)


    input := make(chan string)

    results := make(chan *Result)


    wg := sync.WaitGroup{}

    wg.Add(workers)


    for i := 0; i < workers; i++ {

        go worker(input, results, &wg)

    }


    go search(input)

    go func() {

        wg.Wait()

        close(results)

    }()


    counter := make(map[[32]byte][]string)

    for result := range results {

        counter[result.sha256] = append(counter[result.sha256], result.file)

    }


    for sha, files := range counter {

        if len(files) > 1 {

            fmt.Printf("Found %d duplicates for %s: \n", len(files), hex.EncodeToString(sha[:]))

            for _, f := range files {

                fmt.Println("-> ", f)

            }

        }

    }


}


查看完整回答
反對 回復 2023-04-17
  • 2 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號