如何从档案中查找丢失的文件

如何从档案中查找丢失的文件

我需要帮助一位朋友存档他的旧数据(大约 200GB)。我发现很多文件已经存在于他拥有的较新的存档中,但较新的存档在目录中组织得当。所以我不能简单地使用rsync

我的问题是如何轻松获取新档案中不存在的文件列表。

例如:

$ files_not_present old_dir new_dir
file1
file2
...

答案1

假设您的旧存档文件夹为 old_folder,新存档文件夹为 new_folder

您可以使用以下行来比较两个文件夹,并列出 old_folder 中在 new_folder 中不可用的文件

for %%i in ("old_folder\*") do if not exist "new_folder\%%~nxi" echo(%%~i)>file.csv

希望这可以帮助!

答案2

据我了解,文件具有相同的名称,但它们可以位于不同的子文件夹中。您可以从脚本开始,然后根据您的需要进行开发:

#!/bin/sh
[ -d "$1" -a -d "$2" ] || exit
old_dir="$1"
new_dir="$2"
find "$old_dir/" -type f -exec basename {} \; | sort > oldlist.txt
find "$old_dir/" -type f -exec basename {} \; | sort > newlist.txt
diff oldlist.txt newlist.txt | grep '<'

运行此脚本:

./script.sh old_dir new_dir

这个想法是找到所有文件名(用 去除文件夹名称basename),对列表进行排序并将它们与 进行比较diff。文件列表将留在oldlist.txtnewlist.txt文件中。

答案3

别看下面这个丑陋的 hack。如果我再次这样做,我会更新我的要点以使其更有用: https://gist.github.com/akostadinov/4cda59f17c450f64bbd6

以下是无用的东西:

好的,如果有人需要的话我会使用这种方法:

  1. 获取新旧档案中的文件列表:

    $ find new_dir -type f > arch.txt
    $ find old_dir -type f > arch_old.txt
    

    顺便说一句,您可以使用find -name ".?*" -prune -o -type f来避免隐藏文件

  2. 使用此ruby脚本获取旧档案中存在但不在新档案中的文件列表:

    org_arch = "arch.txt"
    to_arch = "arch_old.txt"
    
    # populate Hash with files under question to archive
    arch={}
    File.open(to_arch, "r") do |infile|
      while (line = infile.gets)
        arch[File.basename(line)] = line
      end
    end
    
    # remove from Hash what has already been archived
    File.open(org_arch, "r") do |infile|
      while (path = infile.gets)
        arch.delete(File.basename(path))
      end
    end
    
    #print files to be archived
    arch.each { |name,path|
      puts path
    }
    
  3. 查看需要复制的文件的大小:

    cat to_arch.txt | xargs -d "\n" stat -c "%s" | awk '{size+=$1} END {print size}'
    

就我而言,我从 200GB 减少到了 80 左右。希望这对某些人有帮助。

相关内容