| #!/usr/bin/env bash |
| set -e |
| |
| dir="$1" |
| |
| if [ -z "$dir" ]; then |
| { |
| echo 'This script is for destroying old /var/lib/docker directories more safely than' |
| echo ' "rm -rf", which can cause data loss or other serious issues.' |
| echo |
| echo "usage: $0 directory" |
| echo " ie: $0 /var/lib/docker" |
| } >&2 |
| exit 1 |
| fi |
| |
| if [ "$(id -u)" != 0 ]; then |
| echo >&2 "error: $0 must be run as root" |
| exit 1 |
| fi |
| |
| if [ ! -d "$dir" ]; then |
| echo >&2 "error: $dir is not a directory" |
| exit 1 |
| fi |
| |
| dir="$(readlink -f "$dir")" |
| |
| echo |
| echo "Nuking $dir ..." |
| echo ' (if this is wrong, press Ctrl+C NOW!)' |
| echo |
| |
| ( set -x; sleep 10 ) |
| echo |
| |
| dir_in_dir() { |
| inner="$1" |
| outer="$2" |
| [ "${inner#$outer}" != "$inner" ] |
| } |
| |
| # let's start by unmounting any submounts in $dir |
| # (like -v /home:... for example - DON'T DELETE MY HOME DIRECTORY BRU!) |
| for mount in $(awk '{ print $5 }' /proc/self/mountinfo); do |
| mount="$(readlink -f "$mount" || true)" |
| if [ "$dir" != "$mount" ] && dir_in_dir "$mount" "$dir"; then |
| ( set -x; umount -f "$mount" ) |
| fi |
| done |
| |
| # now, let's go destroy individual btrfs subvolumes, if any exist |
| if command -v btrfs > /dev/null 2>&1; then |
| # Find btrfs subvolumes under $dir checking for inode 256 |
| # Source: http://stackoverflow.com/a/32865333 |
| for subvol in $(find "$dir" -type d -inum 256 | sort -r); do |
| if [ "$dir" != "$subvol" ]; then |
| ( set -x; btrfs subvolume delete "$subvol" ) |
| fi |
| done |
| fi |
| |
| # finally, DESTROY ALL THINGS |
| ( shopt -s dotglob; set -x; rm -rf "$dir"/* ) |