Create archives
tar -cf archive.tar files/
tar -czf archive.tar.gz files/
tar -cjf archive.tar.bz2 files/
tar -cJf archive.tar.xz files/
Extract archives
tar -xf archive.tar.gz
tar -xzf archive.tar.gz
tar -xjf archive.tar.bz2
tar -xJf archive.tar.xz
tar -xf archive.tar -C /destination/
List contents
tar -tf archive.tar.gz
tar -tvf archive.tar.gz
tar -tf archive.tar.gz | grep filename
Append to archive
tar -rf archive.tar newfile.txt
Exclude files
tar -czf backup.tar.gz --exclude='*.log' directory/
tar -czf backup.tar.gz --exclude='*.log' --exclude='*.tmp' directory/
tar -czf backup.tar.gz --exclude-from=exclude-list.txt directory/
exclude-list.txt example
*.log
*.tmp
.git
node_modules
__pycache__
Incremental backups
tar -czf full-backup.tar.gz -g snapshot.snar directory/
tar -czf incremental.tar.gz -g snapshot.snar directory/
tar -xzf full-backup.tar.gz -g /dev/null
tar -xzf incremental.tar.gz -g /dev/null
Compression comparison
tar -czf file.tar.gz directory/
tar -cjf file.tar.bz2 directory/
tar -cJf file.tar.xz directory/
ls -lh file.tar.*
Preserve permissions
tar -czpf archive.tar.gz directory/
tar -xzpf archive.tar.gz
Verbose output
tar -czvf archive.tar.gz directory/
tar -czf archive.tar.gz --checkpoint=1000 --checkpoint-action=dot directory/
Split large archives
tar -czf - largedir/ | split -b 1G - archive.tar.gz.
cat archive.tar.gz.* | tar -xzf -
Pipe operations
tar -czf - directory/ | ssh user@server 'tar -xzf - -C /destination'
tar -czf - files/ | gpg -c > encrypted.tar.gz.gpg
gpg -d encrypted.tar.gz.gpg | tar -xzf -
Differential backup
touch -t 202512010000 timestamp
tar -czf incremental.tar.gz --newer-mtime=timestamp directory/
tar -czf incremental.tar.gz --newer=timestamp directory/
Extract specific files
tar -xzf archive.tar.gz path/to/file.txt
tar -xzf archive.tar.gz file1 file2 dir/
tar -xzf archive.tar.gz --wildcards '*.txt'
Update archive
tar -uf archive.tar changed-file.txt
tar -czf archive-new.tar.gz directory/
mv archive-new.tar.gz archive.tar.gz
Verify archive
tar -tzf archive.tar.gz > /dev/null
tar -df archive.tar.gz
tar -czf backup.tar.gz directory/ && tar -tzf backup.tar.gz > /dev/null && echo "OK"
Dereference symbolic links
tar -czfh archive.tar.gz directory/
Ownership handling
sudo tar -xzf archive.tar.gz --same-owner
tar -xzf archive.tar.gz --no-same-owner
tar -czf archive.tar.gz --numeric-owner directory/
Custom compression
tar -cf - directory/ | pigz > archive.tar.gz
tar -cf - directory/ | lz4 > archive.tar.lz4
tar -cf - directory/ | zstd > archive.tar.zst
Progress bar
tar -czf - directory/ | pv > archive.tar.gz
pv archive.tar.gz | tar -xzf -
Automated backup script
#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)
SOURCE="/data"
tar -czf "$BACKUP_DIR/backup-$DATE.tar.gz" \
--exclude='*.tmp' \
--exclude='*.log' \
"$SOURCE"
find "$BACKUP_DIR" -name "backup-*.tar.gz" -mtime +7 -delete
tar -tzf "$BACKUP_DIR/backup-$DATE.tar.gz" > /dev/null && \
echo "Backup successful" || \
echo "Backup failed!"
Performance tips
tar -czf archive.tar.gz --gzip --best=1 directory/
tar -cf - directory/ | pigz -p 4 > archive.tar.gz
tar -czf backup.tar.gz --exclude-caches --exclude-vcs directory/
Remote backup
tar -czf - /data | ssh backup-server 'cat > /backups/data.tar.gz'
ssh remote-server 'tar -czf - /data' > remote-backup.tar.gz
Security considerations
tar -czf - sensitive/ | gpg --encrypt -r user@email.com > secure.tar.gz.gpg
gpg --decrypt secure.tar.gz.gpg | tar -xzf -
umask 077
tar -xzf archive.tar.gz
Quick reference
tar -czf archive.tar.gz directory/
tar -cjf archive.tar.bz2 directory/
tar -cJf archive.tar.xz directory/
tar -xzf archive.tar.gz
tar -xf archive.tar.gz -C /dest/
tar -tzf archive.tar.gz
tar -tvzf archive.tar.gz
tar -czf backup.tar.gz --exclude='*.log' dir/
tar -czpf archive.tar.gz directory/
tar -czf backup.tar.gz -g snapshot.snar directory/