https://github.com/kellnerd/backup
Create file-based backups that provide full snapshots with hard links
https://github.com/kellnerd/backup
backup bash-script hard-links rsync snapshot
Last synced: 8 months ago
JSON representation
Create file-based backups that provide full snapshots with hard links
- Host: GitHub
- URL: https://github.com/kellnerd/backup
- Owner: kellnerd
- License: mit
- Created: 2023-03-29T14:47:25.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2023-03-29T15:27:21.000Z (almost 3 years ago)
- Last Synced: 2025-06-07T08:02:15.076Z (9 months ago)
- Topics: backup, bash-script, hard-links, rsync, snapshot
- Language: Shell
- Homepage:
- Size: 5.86 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# backup
Collection of bash scripts that can be used to create unencrypted backups which are easy to browse and restore without dedicated backup software
## Features
- **File-based**: Backups consist of plain file copies which can be restored by any software
- **Full Snapshots**: Each run creates a complete directory tree which includes all current files
- **Incremental**: Unchanged files will not be copied again
- **[Hard Links](https://en.wikipedia.org/wiki/Hard_link)**: No duplicates of unchanged files, snapshots share the same files on disk
## Usage
Create a snapshot of your full home directory (`~`) in the `backup` folder of the current directory (using [`rsync`](https://en.wikipedia.org/wiki/Rsync) under the hood):
```sh
./backup-rsync-inc-snapshot-hardlink.sh ~ ./backup
```
Alternatively you can include only the `~/Documents` and the `~/Pictures` folder:
```sh
./backup-rsync-inc-snapshot-hardlink.sh ~ ./backup Documents Pictures
```
## Directory Structure
Using the last command above might result in the following backup structure (example):
```
backup/
├── 2022-12-31/
│ ├── Documents/
│ │ └── example.txt
│ ├── Pictures/
│ │ └── christmas-2022.jpg
│ └── backup.log
├── 2023-01-07/
│ ├── Documents/
│ │ └── example.txt
│ ├── Pictures/
│ │ ├── christmas-2022.jpg
│ │ └── new-year-2023.jpg
│ └── backup.log
└── latest/
├── Documents/
│ └── example.txt
└── Pictures/
├── christmas-2022.jpg
└── new-year-2023.jpg
```
Each snapshot folder is named after the date of the backup and contains an additional log file which documents the changes since the previous snapshot.
The contents of the `latest` folder are identical to the latest snapshot (here: `2023-01-07`), which means that they are all hard-linked to the same set of files.
Since the `christmas-2022.jpg` picture probably has not changed since 2022, the latest snapshots of it will still point to the same file.
Assuming that `example.txt` has been changed between the two snapshots, `2022-12-31` will still be linked to the old version, while the newer snapshots will link to the updated version.
**Attention**: Never edit files inside one of the snapshots (unless you clearly know what you are doing)!
Touching a file in one of the snapshots also affects all other snapshots which are hard-linked to the same file, which is usually not what you want.
## Other Scripts
If you want to backup multiple shares from an **SMB server** you can have a look at [`backup-smb-shares.sh`](backup-smb-shares.sh):
- Pre-configured (example) paths and SMB user (please modify these to match your setup)
- Asks for the SMB user's password
- Mounts all required SMB shares before performing the backup
- Unmounts all previously mounted SMB shares after the backup has finished
Additionally, there is also an [**older version**](backup-cp-inc-snapshot-hardlink.sh) of the script which uses `cp` instead of `rsync`.
The main difference is that it will not delete files from the latest snapshot which have been deleted in the source.