A
cd ..
Tools

Diff & File Comparison

Compare files and directories with diff, comm, and cmp.

2025-10-27
diff, comparison, tools

Basic diff

diff file1.txt file2.txt

Side-by-side comparison

diff -y file1.txt file2.txt

Unified diff format

diff -u file1.txt file2.txt

Context diff

diff -c file1.txt file2.txt

Ignore whitespace

diff -w file1.txt file2.txt

Ignore blank lines

diff -B file1.txt file2.txt

Ignore case

diff -i file1.txt file2.txt

Brief comparison

diff -q file1.txt file2.txt

Recursive directory diff

diff -r dir1/ dir2/

Generate patch file

diff -u original.txt modified.txt > changes.patch

Apply patch

patch original.txt < changes.patch

Reverse patch

patch -R original.txt < changes.patch

Show only differences

diff --changed-group-format='%<' --unchanged-group-format='' file1 file2

Color output

diff --color file1.txt file2.txt

Compare three files

diff3 file1.txt file2.txt file3.txt

COMM - Compare sorted files

comm file1.txt file2.txt

Output columns:

  • Column 1: Lines only in file1
  • Column 2: Lines only in file2
  • Column 3: Lines in both files

Show only unique to file1

comm -23 file1.txt file2.txt

Show only unique to file2

comm -13 file1.txt file2.txt

Show only common lines

comm -12 file1.txt file2.txt

CMP - Binary comparison

cmp file1 file2

Verbose cmp

cmp -l file1 file2

Silent cmp (exit code only)

cmp -s file1 file2 && echo "Files are identical"

Vimdiff

vimdiff file1.txt file2.txt

Vimdiff commands:

  • ]c - Next difference
  • [c - Previous difference
  • do - Diff obtain (get from other)
  • dp - Diff put (send to other)
  • :diffupdate - Refresh
  • :qa - Quit all

Colordiff

# Install colordiff first
diff file1.txt file2.txt | colordiff

Git diff

git diff file1.txt file2.txt

Diff with line numbers

diff -u file1.txt file2.txt | grep -E "^@@|^\+|^-"

Diff statistics

diff -u file1.txt file2.txt | diffstat

Ignore specific lines

diff -I '^#' file1.txt file2.txt

Context lines

# 3 lines of context
diff -C 3 file1.txt file2.txt

# 5 lines of context
diff -U 5 file1.txt file2.txt

Diff output formats

# Normal
diff file1 file2

# Context (-c)
diff -c file1 file2

# Unified (-u, most common)
diff -u file1 file2

# Side by side (-y)
diff -y file1 file2

# Brief (-q)
diff -q file1 file2

Directory comparison

# Recursive with summary
diff -rq dir1/ dir2/

# Show only files that differ
diff -rq dir1/ dir2/ | grep differ

# Show only in dir1
diff -rq dir1/ dir2/ | grep "Only in dir1"

Exclude files from diff

diff -r --exclude='*.log' dir1/ dir2/

Exclude patterns

diff -r -x '*.pyc' -x '__pycache__' dir1/ dir2/

Compare with original

# Backup original
cp file.txt file.txt.orig

# Make changes to file.txt

# Compare
diff -u file.txt.orig file.txt

Batch comparison

for file in dir1/*; do
    diff "$file" "dir2/$(basename "$file")"
done

Diff with timestamps

diff -u --label "original $(date)" --label "modified $(date)" file1 file2

Advanced diff script

#!/bin/bash
# Compare two directories with report

DIR1=$1
DIR2=$2

echo "Files only in $DIR1:"
diff -rq "$DIR1" "$DIR2" | grep "Only in $DIR1"

echo -e "\nFiles only in $DIR2:"
diff -rq "$DIR1" "$DIR2" | grep "Only in $DIR2"

echo -e "\nFiles that differ:"
diff -rq "$DIR1" "$DIR2" | grep differ

Create unified patch

diff -Naur original/ modified/ > changes.patch

Flags:

  • -N - Treat absent files as empty
  • -a - Treat all files as text
  • -u - Unified format
  • -r - Recursive

Apply patch with dry run

patch --dry-run -p1 < changes.patch

Meld (GUI diff tool)

meld file1.txt file2.txt
meld dir1/ dir2/

Beyond Compare (commercial)

bcompare file1.txt file2.txt

Diff aliases

Add to ~/.bashrc:

alias dif='diff --color=auto'
alias sdiff='diff -y'
alias rdiff='diff -r'

Was this useful?

Share with your team

Browse More