Saya mencoba untuk memahami perintah diff linux pada dua file yang garis-garisnya hanya permutasi satu sama lain tetapi tidak dapat grok output yang dihasilkannya. Perhatikan tiga perintah di bawah ini:
[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples
Dapatkah seseorang menjelaskan keluaran cryptic di atas dari diff.
- Mengapa tidak ada menyebutkan "jeruk" sama sekali dalam output?
- Apa
1d0
dan apa2a2
artinya?
Saya mengerti dari jawaban ini bahwa:
"<" berarti baris tidak ada di file2 dan ">" berarti baris hilang di file1
TAPI itu tidak menjelaskan mengapa jeruk hilang dalam output.
oranges
merupakan bagian umum terbesar antara kedua file, jadi apa yang Anda dapatkan adalah cara terpendek untuk mengekspresikan perbedaan antara keduanya.diff -u file1 file2
saja. Itu disebut format "unified diff". Format diff asli dimaksudkan untuk menjadi sangat kompak, tetapi diff unified dimaksudkan untuk menjadi lebih mudah dibaca.diff -y file1 file2
Jawaban:
Untuk memahami laporan, ingatlah bahwa
diff
ini adalah preskriptif, yang menjelaskan perubahan apa yang perlu dilakukan pada file pertama (file1
) agar sama dengan file kedua (file2
).Secara khusus,
d
in1d0
berarti delete dana
in2a2
berarti add .Demikian:
1d0
berarti baris 1 harus dihapus difile1
(apples
).0
di1d0
baris 0 berarti di mana mereka akan muncul di file kedua (file2
) seandainya mereka tidak dihapus. Itu berarti ketika mengubahfile2
kefile1
(mundur) menambahkan baris 1file1
setelah baris 0 darifile2
.2a2
berarti menambahkan baris kedua (oranges
) darifile2
ke baris kedua sekarangfile1
(setelah menghapus baris pertamafile1
,oranges
beralih ke baris 1)sumber
0
di dalam1d0
?Pertimbangkan file-file ini:
file1
:file2
:Bagaimana cara
diff
kerjanya, mengingat itu berdasarkan pesanan:diff
membaca blok pertama dari garisfile1
danfile2
, dan mencoba menemukan garis yang sama:Sekarang akan melewati semua baris yang sama di kedua file, yang hanya
oranges
dalam kasus ini:Sekarang temukan satu set garis yang sama dan cetak perbedaan:
Lewati garis yang sama
Temukan garis yang identik, jika mungkin, dan cetak perbedaan:
Sekarang jika saya lakukan
diff file1 file2
:Sekarang mudah untuk menjelaskan apa
diff
artinya output:Agar
file1
setara denganfile2
:1,2d0
: Hapus (d
) baris1-2
darifile1
dan memodifikasi garis0
darifile2
sesuai3a2
: Append (a
) dengan garis3
darifile1
garis2
darifile2
4a4,5
: Append untuk berbaris4
darifile1
garis4-5
darifile2
diff
membandingkanfile1
denganfile2
baris demi baris dan menyelesaikan perbedaan dalam memori sementara. Setelah membuatfile1
sama denganfile2
sampai kemunculan pertama suatu garis dalamfile1
, yang juga terjadi padafile2
, semua garis yang sama sampai suatu perbedaan tidak disebutkan, sering diindikasikan sebagai---
. Dalam hal ini hanya ada satu baris yang sama, yaituoranges
. Perhatikan bahwa saya katakanfile1
sama denganfile2
, sehinggafile1
dipandang relatiffile2
dan bukan sebaliknya.Output dalam kaitannya dengan file pertama yang diberikan, dalam hal ini
file1
.sumber
apples
terjadi di kedua file juga.oranges
". Salah: Sebenarnya ada dua garis, yang tidak hanya mirip , tetapi juga identik . Salah satu dari mereka membacaoranges
, yang lain membacaapples
. Juga, penjelasan Anda (murni berdasarkan pesanan) bertentangan dengan komentar Stéphane tentang pertanyaan (berdasarkan panjang) - siapa yang benar?Mereka disana:
sumber
Format output standar (lama) akan menampilkan perbedaan antara file tanpa teks di sekitarnya dengan area di mana file berbeda.
Misalnya:
1d0 <
(hapus) berarti apel harus dihapus dari baris pertamafile1
, dan2a2 >
(tambahkan) berarti apel harus ditambahkan kefile2
baris kedua, sehingga kedua file dapat dicocokkan.Dokumentasi tersedia di
info diff
menjelaskan lebih lanjut:Lihat juga:
Jadi untuk melihat jeruk, Anda harus membuatnya berdampingan atau dengan menggunakan konteks terpadu.
Sebagai contoh:
sumber