快速比较Bash中的大量文件

快速比较Bash中的大量文件,bash,Bash,我从一个网站下载了很多文件(~10000),其中大部分都是一些无用的html,它们都说了同样的话。然而,在这个大海捞针中有一些文件包含有用的信息(因此是相当不同的文件),我需要一种快速的方法将它们与其他文件区分开来。我知道我可以逐个检查所有文件,并使用cmp与模板进行比较,看看它们是否相同,然后删除它们。然而,这是相当缓慢的。有没有更快的方法?我不介意恢复率只有99%。假设所有文件都在当前目录中或以下,模板在父目录中,并且文件名没有空格: find . -type f -print | whil

我从一个网站下载了很多文件(~10000),其中大部分都是一些无用的html,它们都说了同样的话。然而,在这个大海捞针中有一些文件包含有用的信息(因此是相当不同的文件),我需要一种快速的方法将它们与其他文件区分开来。我知道我可以逐个检查所有文件,并使用cmp与模板进行比较,看看它们是否相同,然后删除它们。然而,这是相当缓慢的。有没有更快的方法?我不介意恢复率只有99%。

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

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

如果您对该操作感到满意,请删除“echo”。

此选项列出了作为参数传递的树中的唯一文件:

#!/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
#/bin/bash
声明-唯一性
而IFS=read-r文件;做
[[!“${uniques[${file%%*}]]]和&uniques[${file%%*}]=“${file}

done<要清楚:您想删除所有内容与指定模板文件内容匹配的文件吗?您可以在问题中做得更具体一些。你是说大多数文件都是相同的,即内容从头到尾都是逐字节匹配的吗?或者只是因为他们很相似?当你说一些文件“因此相当不同”时,你是什么意思?内容不同?文件类型?尺寸?还有什么?是的,我想删除匹配的文件,它们都是完全相同的,逐字节。不同的文件有额外的信息,因此会更大,但会是相同的文件类型。如果重要的文件有不同的大小,只需
ls-ls
,然后删除相同大小的文件(您可以使用
grep
选择它们,但如果文件名包含空格,请小心)@choroba我有太多的文件,无法单独选择它们~500个。是否有一种方法可以简单地使用Bash来实现这一点?这将执行大量冗余的比较。对您的文件运行
md5sum
,然后选择唯一的文件。@triplee:你说得对,那好多了。我会更新代码
#!/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