我需要帮助一位朋友存档他的旧数据(大约 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.txt
和newlist.txt
文件中。
答案3
别看下面这个丑陋的 hack。如果我再次这样做,我会更新我的要点以使其更有用: https://gist.github.com/akostadinov/4cda59f17c450f64bbd6
以下是无用的东西:
好的,如果有人需要的话我会使用这种方法:
获取新旧档案中的文件列表:
$ find new_dir -type f > arch.txt $ find old_dir -type f > arch_old.txt
顺便说一句,您可以使用
find -name ".?*" -prune -o -type f
来避免隐藏文件使用此
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 }
查看需要复制的文件的大小:
cat to_arch.txt | xargs -d "\n" stat -c "%s" | awk '{size+=$1} END {print size}'
就我而言,我从 200GB 减少到了 80 左右。希望这对某些人有帮助。