快速比较Bash中的大量文件

时间:2011-11-10 15:22:29

标签: bash

我从一个网站下载了很多文件(~10,000),其中大部分是一堆无用的html,都说同样的事情。但是,这个大海捞针中有一些文件具有有用的信息(因此文件相当不同),我需要一种快速的方法将这些文件与其他文件分开。我知道我可以逐个浏览所有文件并使用cmp与模板进行比较,看看它们是否相同,并删除它们。但是,这很慢。有更快的方法吗?我不介意我的回收率是否只有99%。

2 个答案:

答案 0 :(得分:1)

这个列出了作为参数传递的树中的唯一文件:

#!/bin/bash
declare -A uniques
while IFS= read -r file; do
    [[ ! "${uniques[${file%% *}]}" ]] && uniques[${file%% *}]="${file##* }"
done< <(find "$1" -type f -exec md5sum -b "{}" \;)

for file in ${uniques[@]}; do
    echo "$file"
done

非常感谢使用md5sum的更好方法的三重奏!

以前的版本:

#!/bin/bash
declare -a files uniques

while IFS= read -r -d $'\0' file; do
    files[${#files[@]}]="$file"
done< <(find "$1" -type f -print0)

uniques=( ${files[@]} )
for file in "${files[@]}"; do
    for unique in "${!uniques[@]}"; do
        [[ "$file" != "${uniques[$unique]}" ]] && cmp -s "$file" "${uniques[$unique]}" && && unset -v uniques[$unique]
    done
done

for unique in "${uniques[@]}"; do
    echo "$unique"
done

答案 1 :(得分:0)

假设所有文件都在当前目录中或下面,并且模板位于父目录中,并且文件名没有空格:

find . -type f -print | while read -r filename; do
  if ! cmp --quiet $filename ../template; then
    echo rm $filename
  fi
done

如果您对此有效,请删除“echo”。