Narzędzie DIFF działa dla 2 plików. Jak porównać więcej niż 2 pliki naraz?

84

Więc narzędzie Diff działa tak, jak chcę dla 2 plików, ale mam projekt, który wymaga porównań z więcej niż 2 plikami naraz, może do 10 na raz. Wymaga to również umieszczenia wszystkich tych plików obok siebie. Moje badania tak naprawdę nic nie pokazały, vimdiff wydaje się być najlepszy z dotychczasowymi możliwościami porównywania 4 na raz.

Moje pytanie: czy istnieje narzędzie do porównywania więcej niż 2 plików naraz lub sposób na zhakowanie diff / vimdiff, aby można było dokonać wielu porównań? Pliki, które będę porównywać są stosunkowo krótkie, więc nie powinno to być zbyt wolne.

Z góry dziękuję!

Javed Ahamed
źródło

Odpowiedzi:

111

Wyświetlanie 10 plików obok siebie i podkreślanie różnic można łatwo zrobić za pomocą Diffuse . Po prostu określ wszystkie pliki w wierszu poleceń w następujący sposób:

diffuse 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt 10.txt


źródło
1
Wow, to jest niesamowite! Dzięki za spóźnioną odpowiedź, wciąż potrzebowałem pomocy.
Javed Ahamed
1
Jak nazywa się to porównanie?
leeand00
4
Fantastyczne narzędzie; właśnie pomogła mi rozwiązać irytujący problem. Wiem, że to starsza odpowiedź, ale dziękuję!
SeanKilleen,
Dziękuję tysiąc razy! Bardzo pomogło znaleźć małe różnice w kilku wklejonych plikach.
Trass3r
1
@Gruber - Muszę kliknąć link w złym momencie - usunąłem swój komentarz
Combatc2
28

Vim może już to zrobić:

vim -d file1 file2 file3

Ale zwykle jesteś ograniczony do 4 plików. Możesz to jednak zmienić, modyfikując pojedynczą linię w źródle Vima. Stała DB_COUNTdefiniuje maksymalną liczbę plików różnicowych i jest zdefiniowana u góry diff.cw wersjach 6.xi wcześniejszych lub około dwóch trzecich w dół structs.hw wersjach 7.0 i nowszych.

Noah Medling
źródło
vimdiff lub vim -d może wykonywać tylko 4 pliki naraz, przynajmniej na moim komputerze. ktoś wie, jak to ominąć?
Javed Ahamed,
Nie zauważyłem o tym wzmianki w pytaniu. Zaktualizowano, aby zawierał instrukcje dotyczące zmiany limitu Vima.
Noah Medling
Hej, czy wiesz, jak właściwie dostać się do structs.h lub diff.c? Nie mogę znaleźć kodu źródłowego VIM na Win lub Linux.
Javed Ahamed
vim nie wydaje się być w stanie porównywać katalogów dla więcej niż dwóch katalogów, co ogranicza użyteczność. Kolejnym ograniczeniem jest to, że podczas porównywania plików można zobaczyć tylko lewą stronę pliku, nie ma pasków przewijania, aby zobaczyć wszystko. I nie ma metody GUI do przesuwania zmian w tę iz powrotem.
Jereme Guenther
7

diffma wbudowaną opcję --from-filei --to-file, która porównuje jeden operand ze wszystkimi innymi.

   --from-file=FILE1
          Compare FILE1 to all operands.  FILE1 can be a directory.

   --to-file=FILE2
          Compare all operands to FILE2.  FILE2 can be a directory.
Peacher Wu
źródło
Chciałbym móc sprawić, by działało z podstawianiem procesów zamiast prawdziwych ścieżek plików.
Jan Kyu Peblik
1
@JanKyuPeblik Jeśli używasz zsh, sprawdź formę podstawienia procesu = (...), która zapisuje dane wyjściowe do pliku tymczasowego i rozwija do nazwy tego pliku tymczasowego zsh.sourceforge.net/Doc/Release/…
Eric Freese
2

Checkout „Beyond Compare”: http://www.scootersoftware.com/

Pozwala porównać całe katalogi plików i wygląda na to, że działa również w systemie Linux.

Scott Anderson
źródło
1
diff -r również porównuje całe katalogi plików, ale zawsze porównuje tylko pliki z jednego katalogu z plikami z innego katalogu
reinierpost
6
Beyond Compare to wspaniałe narzędzie i używam go cały czas do rozwiązywania konfliktów scalania. Jednak nie jest to odpowiednie narzędzie do tego zadania, ponieważ może porównać tylko dwa pliki ze sobą lub ze wspólnym przodkiem.
Superole
Przepraszamy za -1, ale chodzi o porównywanie wielu plików między sobą.
Manohar Reddy Poreddy
1

jeśli uruchamiasz wiele różnic w oparciu o jeden plik, prawdopodobnie możesz spróbować napisać skrypt, który ma pętlę for, aby przejść przez każdy katalog i uruchomić różnicę. Chociaż nie byłoby to obok siebie, można by je przynajmniej szybko porównać. mam nadzieję, że pomogło.

Benjamin Neil
źródło
tak, ale gdybym porównał na przykład 3 pliki, chciałbym, aby wszystkie różniły się od każdego z pozostałych 2 plików, ponieważ diff robi to przestawiając, aby zobaczyć, gdzie pasują.
Javed Ahamed
Znalazłem to polecenie, które może pomóc w twoim skrypcie, nazywa się diff3 i prawdopodobnie jest to narzędzie do porównywania trzech plików. linux.about.com/library/cmd/blcmdl1_diff3.htm wersję dla Windows można znaleźć tutaj gnuwin32.sourceforge.net/packages/diffutils.htm
Benjamin Neil
0

Nie odpowiadam na główne pytanie, ale oto coś podobnego do tego, co zasugerował Benjamin Neil, ale różni się wszystkie pliki:

Przechowuj nazwy plików w tablicy, a następnie zapętlaj kombinacje rozmiaru dwa i diff (lub zrób, co chcesz).

files=($(ls -d /path/of/files/some-prefix.*))     # Array of files to compare
max=${#files[@]}                                  # Take the length of that array
for ((idxA=0; idxA<max; idxA++)); do              # iterate idxA from 0 to length
  for ((idxB=idxA + 1; idxB<max; idxB++)); do     # iterate idxB + 1 from idxA to length
    echo "A: ${files[$idxA]}; B: ${files[$idxB]}" # Do whatever you're here for.
  done
done

Pochodzi z odpowiedzi @ charles-duffy : https://stackoverflow.com/a/46719215/1160428

anask
źródło
0

Jest na to prosty, dobry sposób = GREP.

W zależności od rozmiaru tekstu możesz go skopiować i wkleić lub możesz przekierować wejście pliku do polecenia grep. Jeśli utworzysz grep -vir / path w celu wykonania wyszukiwania wstecznego lub grep -ir / path. To jest mój sposób na egzaminy certyfikacyjne.

user14565488
źródło