gpt4 book ai didi

linux - 三个文件的交集

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:42 26 4
gpt4 key购买 nike

我的互联网连接不佳,并尝试下载相同的 rar 压缩包 (> 500 Mo) 三次。每个文件都已损坏,但我希望可以创建三个损坏的第四个文件的交集而没有任何损坏。
我对 diff 或 comm 不满意,不知道是否可以用它来做我想做的事。
感谢您的帮助!

最佳答案

按照 chepner 在评论中的想法,这里是我将如何重建可能的原件。

#!/bin/bash

FILE1="$1"
FILE2="$2"
FILE3="$3"
RESFILE="$4"

diff_at() {
POS=$(cmp "$1" "$2" -i $3 | sed 's/,//' | cut -d ' ' -f 5)
if [ "$POS" == "" ]; then
POS=$(du -b "$1" "$2" | cut -f 1 | sort | head -n1) # min()
fi
echo $POS
}

max() {
if [ $# -eq 0 ]; then # Degenerate case
echo ""
elif [ $# -eq 1 ]; then # Base case
echo $(($1 + 0)) # Strings are interpreted as 0
else
V=$1
shift
M=$(max $@)
echo $(($V > $M ? $V : $M))
fi
}

# Shallow check of arguments
if [ $# -ne 4 ]; then
echo "Provide three files to compare and a file to write output into."
exit 1
fi

# If one of them is larger, you cannot compare its (probable) correctness
S1=$(du -b "$FILE1" | cut -f 1)
S2=$(du -b "$FILE2" | cut -f 1)
S3=$(du -b "$FILE3" | cut -f 1)
if [ $S1 -gt $S2 -a $S1 -gt $S3 -o $S2 -gt $S1 -a $S2 -gt $S3 -o $S3 -gt $S2 -a $S3 -gt $S1 ]; then
echo "$0: Unable to reconstruct original file."
exit 1
fi
FILESIZE=$(max $S1 $S2 $S3)

# The idea is that of extracting and appending the common part
truncate -s 0 "$RESFILE" # This will overwrite existing output
BIAS=0
while [ $BIAS -lt $FILESIZE ]; do
I12=$(diff_at "$FILE1" "$FILE2" $BIAS)
I23=$(diff_at "$FILE2" "$FILE3" $BIAS)
I31=$(diff_at "$FILE3" "$FILE1" $BIAS)

# Unreconstructible, aka all of them differ at the same byte
if [ $I12 -eq $I23 -a $I12 -eq $I31 ]; then
echo "$0: Unable to reconstruct original file."
break;
fi

# Biggest common part
MAXBYTE=$(max $I12 $I23 $I31)

# Exclude the file with wrong byte
if [ $I12 -eq $MAXBYTE -o $I31 -eq $MAXBYTE ]; then
tail -c+$(($BIAS + 1)) "$FILE1" | head -c $(($MAXBYTE - 1)) >> "$RESFILE"
else
tail -c+$(($BIAS + 1)) "$FILE2" | head -c $(($MAXBYTE - 1)) >> "$RESFILE"
fi

# Update position
BIAS=$(($BIAS + $MAXBYTE - 1))
done

为了处理“猜测”(同一位置的所有三个字节都不同),您需要提交对脚本的更改。

我认为从许多角度来看,有比上述更好的选择,所以请将其视为快速而肮脏的选择。

关于linux - 三个文件的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49352827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com