Diff Katalog Rekurencyjnie, Ignorując Wszystkie Pliki Binarne:

Praca nad Fedorą. Szukam diff dwóch katalogów rekurencyjnie, aby sprawdzić zmiany źródłowe. Ze względu na konfigurację projektu (przed moim własnym zaangażowaniem w ten projekt! sigh ), katalogi zawierają zarówno źródła, jak i binaria, a także duże binarne zbiory danych. Podczas gdy diffing ostatecznie działa na tych katalogach, zajęłoby to może dwadzieścia sekund, gdybym mógł zignorować pliki binarne.

O ile rozumiem, diff nie ma ' ignorować tryb pliku binarnego, ale posiada argument ignoruj, który ignoruje Wyrażenie regularne W pliku. Nie wiem co tam napisać aby ignorować pliki binarne, niezależnie od rozszerzenia.

Używam poniższego polecenia, ale nie ignoruje ono plików binarnych. Czy ktoś wie jak zmodyfikować to polecenie aby to zrobić?

Diff-RQ dir1 dir2

Author: Zéychin, 2011-07-15

6 answers

Może użyć grep -I (co jest równoważne grep --binary-files=without-match) jako filtra do sortowania plików binarnych.

dir1='folder-1'
dir2='folder-2'
IFS=$'\n'
for file in $(grep -Ilsr -m 1 '.' "$dir1"); do
   diff -q "$file" "${file/${dir1}/${dir2}}"
done
 30
Author: jon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-15 19:04:55

Trochę oszustwa, ale oto czego użyłem:

diff -r dir1/ dir2/ | sed '/Binary\ files\ /d' >outputfile

To rekurencyjnie porównuje dir1 do dir2, sed usuwa linie dla plików binarnych (zaczyna się od "pliki binarne"), a następnie jest przekierowywany do pliku wyjściowego.

 60
Author: Shannon VanWagner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-17 19:31:43

Doszedłem do tego (starego) pytania szukając czegoś podobnego(pliki konfiguracyjne na starszym serwerze produkcyjnym w porównaniu do domyślnej instalacji apache). Podążając za sugestią @fearlesstost w komentarzach, git jest na tyle lekki i szybki, że prawdopodobnie jest prostszy niż jakakolwiek z powyższych sugestii. skopiuj wersję1 do nowego katalogu. Więc zrób:

git init
git add .
git commit -m 'Version 1'

Teraz usuń wszystkie pliki z wersji 1 w tym katalogu i skopiuj wersję 2 do katalogu. Teraz do:

git add .
git commit -m 'Version 2'
git show

To pokaże ci wersję Gita wszystkich różnic pomiędzy pierwszym commitem a drugim. W przypadku plików binarnych wystarczy powiedzieć, że różnią się one. Alternatywnie, możesz utworzyć gałąź dla każdej wersji i spróbować połączyć je za pomocą narzędzi do scalania Gita.

 11
Author: RecursivelyIronic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-15 22:16:55

Jeśli nazwy plików binarnych w Twoim projekcie są zgodne z określonym wzorem (*.o,*. so,...), jak zwykle, można umieścić te wzorce w pliku i określić je za pomocą-X (myślnik X).

Zawartość mojego " exclude file" *.o * . so *.git

diff -X exclude_file -r . other_tree > my_diff_file
 1
Author: Mohan S Nayaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-02 08:52:28

Użyj kombinacji find i file. Wymaga to przeprowadzenia pewnych badań na wyjściu polecenia file w katalogu; poniżej zakładam, że pliki, które chcesz diff, są zgłaszane jako ascii. Lub użyj grep -v, aby odfiltrować pliki binarne.

#!/bin/bash

dir1=/path/to/first/folder
dir2=/path/to/second/folder

cd $dir1
files=$(find . -type f -print | xargs file | grep ASCII | cut -d: -f1)

for i in $files;
do
    echo diffing $i ---- $dir2/$i
    diff -q $i $dir2/$i
done

Ponieważ prawdopodobnie znasz nazwy ogromnych binariów, umieść je w tablicy haszującej i wykonuj diff tylko wtedy, gdy plik nie jest w haszu, coś takiego:

#!/bin/bash

dir1=/path/to/first/directory
dir2=/path/to/second/directory

content_dir1=$(mktemp)
content_dir2=$(mktemp)

$(cd $dir1 && find . -type f -print > $content_dir1)
$(cd $dir2 && find . -type f -print > $content_dir2)

echo Files that only exist in one of the paths
echo -----------------------------------------
diff $content_dir1 $content_dir2    

#Files 2 Ignore
declare -A F2I
F2I=( [sqlite3]=1 [binfile2]=1 )

while read f;
do
    b=$(basename $f)
    if ! [[ ${F2I[$b]} ]]; then
        diff $dir1/$f $dir2/$f
    fi
done < $content_dir1
 0
Author: Fredrik Pihl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-15 21:24:07

Cóż, jako prymitywne sprawdzenie, można zignorować pliki pasujące do /\0/.

 0
Author: Troy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-29 07:17:40