Oblicz% różnicy i rozmiary plików między dwoma plikami

-2

Mamy dwa pliki zip i chcielibyśmy je porównać.

Jesteśmy również zainteresowani obliczeniem różnicy procentowej między nimi a rozmiarem pliku. Czy istnieje narzędzie, które może to zrobić szybko?

chz
źródło
1
„różnica procentowa” to niejednoznaczna metryka. Jeśli oryginalny plik ma długość 100 bajtów i jest modyfikowany przez wstawienie nowego bajtu dokładnie w środku, to nowy plik "różne" o 1% lub 50%? Czy masz inną odpowiedź, jeśli były to pliki tekstowe i linie zamiast bajtów? TO ZNACZY. porównaj wyniki cmp przeciw diff.
sawdust
Myślę, że OP odnosi się do różnicy w rozmiarze pliku (prawdopodobnie do porównania stopnia kompresji?)
Pincopallino

Odpowiedzi:

4

Możesz spróbować skryptu basha takiego jak ten:

#!/bin/bash
SIZE1=$(stat -f "%z" "$1")
SIZE2=$(stat -f "%z" "$2")
PERC=$(bc <<< "scale=2; ($SIZE2 - $SIZE1)/$SIZE1 * 100")
echo "$PERC %"

Następnie wywołujesz skrypt, przekazując dwa pliki jako argumenty. Użyłem polecenia stat -f "%z" "$1" aby uzyskać rozmiar pliku i działa na OS X. W zależności od dystrybucji Linuksa może być potrzebna inna składnia, na przykład stat -c%s FILENAMElub du -b FILENAME. Spróbuj w konsoli, powinieneś otrzymać liczbę bajtów jako wynik.

Zauważ, że musimy wywołać program bc ponieważ Bash nie może wykonywać arytmetyki zmiennoprzecinkowej.

Oczywiście możesz zmodyfikować skrypt, aby spełnić swoje potrzeby. Jeśli chcesz porównać dwa skompresowane pliki za pomocą nieskompresowanego pliku, możesz dodać inną zmienną i wykonać żądaną matematykę bc.

Pincopallino
źródło
Dzięki, Pincopallino. Próbuję z twoimi sugestiami.
chz
0

Możesz po prostu napisać skrypt Perla do obsługi zadania. Jest mniej brudny niż Bash.

Oto przykład takiego skryptu. Oblicza zmniejszenie rozmiaru pliku między oryginalnym i skompresowanym plikiem.

#!/usr/bin/env perl
use strict;
use warnings;

die "You must define at least 2 files to compare!\n" unless defined $ARGV[0] && defined $ARGV[1];
die "File $ARGV[0] does not exist!\n" unless -e $ARGV[0];
die "File $ARGV[1] does not exist!\n" unless -e $ARGV[1];

my ($original, $compressed) = (-s $ARGV[0], -s $ARGV[1]);

printf "FILESIZE REDUCTION: %.2f%%\n", ($compressed / $original - 1) * -100;

Wykonujesz to w ten sposób: perl compare_filesizes.pl my_fancy_javascript.js my_fancy_javascript_min.js

UWAGA: Możesz wycenić lub usunąć die warunki. Są tylko po to, aby przypomnieć użytkownikowi, aby prawidłowo używał tego skryptu.

techouse
źródło