nuke-graph-directory.sh 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #!/usr/bin/env bash
  2. set -e
  3. dir="$1"
  4. if [ -z "$dir" ]; then
  5. {
  6. echo 'This script is for destroying old /var/lib/docker directories more safely than'
  7. echo ' "rm -rf", which can cause data loss or other serious issues.'
  8. echo
  9. echo "usage: $0 directory"
  10. echo " ie: $0 /var/lib/docker"
  11. } >&2
  12. exit 1
  13. fi
  14. if [ "$(id -u)" != 0 ]; then
  15. echo >&2 "error: $0 must be run as root"
  16. exit 1
  17. fi
  18. if [ ! -d "$dir" ]; then
  19. echo >&2 "error: $dir is not a directory"
  20. exit 1
  21. fi
  22. dir="$(readlink -f "$dir")"
  23. echo
  24. echo "Nuking $dir ..."
  25. echo ' (if this is wrong, press Ctrl+C NOW!)'
  26. echo
  27. (
  28. set -x
  29. sleep 10
  30. )
  31. echo
  32. dir_in_dir() {
  33. inner="$1"
  34. outer="$2"
  35. [ "${inner#$outer}" != "$inner" ]
  36. }
  37. # let's start by unmounting any submounts in $dir
  38. # (like -v /home:... for example - DON'T DELETE MY HOME DIRECTORY BRU!)
  39. for mount in $(awk '{ print $5 }' /proc/self/mountinfo); do
  40. mount="$(readlink -f "$mount" || true)"
  41. if [ "$dir" != "$mount" ] && dir_in_dir "$mount" "$dir"; then
  42. (
  43. set -x
  44. umount -f "$mount"
  45. )
  46. fi
  47. done
  48. # now, let's go destroy individual btrfs subvolumes, if any exist
  49. if command -v btrfs > /dev/null 2>&1; then
  50. # Find btrfs subvolumes under $dir checking for inode 256
  51. # Source: http://stackoverflow.com/a/32865333
  52. for subvol in $(find "$dir" -type d -inum 256 | sort -r); do
  53. if [ "$dir" != "$subvol" ] && subvolType="$(stat -f --format=%T "$subvol")" && [ "$subvolType" = "btrfs" ]; then
  54. (
  55. set -x
  56. btrfs subvolume delete "$subvol"
  57. )
  58. fi
  59. done
  60. fi
  61. # finally, DESTROY ALL THINGS
  62. (
  63. shopt -s dotglob
  64. set -x
  65. rm -rf "$dir"/*
  66. )