【问题标题】:Compare all file sizes of 2 directories in bash比较bash中2个目录的所有文件大小
【发布时间】:2011-07-19 04:03:05
【问题描述】:

有时,由于某种原因,复制许多文件(即复制到外部 HDD;使用 Nautilus 文件管理器)的过程会崩溃。如果我再次启动它,我会忽略已经存在的文件,尽管其中一些文件没有 100% 复制。所以属性窗口在源文件夹中显示“460 个文件(225 GB)”,在目标文件夹中显示“460 个文件(222 GB)”...

我现在如何找出哪些文件仅被部分复制(可能使用lsdiff)?

【问题讨论】:

    标签: bash file diff size directory


    【解决方案1】:

    如果您有可用的rsync,则可以在两个本地目录之间正常工作。

    【讨论】:

    • +1。这绝对是同步目录的方式,它比你用 shell 脚本做的任何事情都要快得多。
    • 不是那个问题的答案,而是最好的一个 :-) 我以前用过 rsync 一到两次,但认为它并不比 cp'ing 好多少...
    • 有时“不要用错误的工具打败自己”就是问题的答案。 :-)
    • 对 OP 的回答很好,但我发现这个问题是因为我想区分文件大小
    【解决方案2】:
    for f1 in dir1/*
    do
        f2="dir2/${f##*/}"
        if [[ $(sum "$f1") != $(sum "$f2") ]]
        then
            printf 'File %s does not match %s\n' "$f1" "$f2"
        fi
    done
    

    或者你可以用这个作为你的测试:

        if ! diff -q "$f1" $f2" >/dev/null
    

    【讨论】:

      【解决方案3】:

      我修改了丹尼斯的代码。它比较文件大小。比比较校验和更快但不安全..

      source=/???
      target=/???
      
      
      for i in "$source"/*
      do
       f1=`stat -c%s $i`
       f2=`stat -c%s $target/${i##*/}`
        if [ "$f1" = "$f2" ]; then
              echo "$i" "$f1" VS "$target/${i##*/}" "$f2" "====>>>" "OK"
        else
              echo "$i" "$f1" VS "$target/${i##*/}" "$f2" "====>>>" "BAD"
        fi
      done  
      

      【讨论】:

      • 如果您有stat 可用。此外,您应该使用$() 而不是反引号。此外,对于每个 echo 语句,一组引号就足够了。你为什么要这样拆散他们?
      • 这对子目录不起作用,对吧..?因为我的文件夹包含许多子文件夹以及其他子文件夹等,所以我认为最好使用find (?)
      • 是的,它不适用于子目录。应该这么写的。
      猜你喜欢
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2013-10-12
      • 1970-01-01
      相关资源
      最近更新 更多